请考虑以下代码:
type ResourceData = {
user: { id: number; name: string; email: string }
product: { id: number; name: string; price: number }
order: { id: number; userId: number; productId: number; quantity: number }
}
type ResourceAction<T extends keyof ResourceData> = {
type: T
payload: ResourceData[T]
}
function fetchActionData<T extends keyof ResourceData>(
action: ResourceAction<T>,
) {
const actionPayload = action.payload as ResourceData[T] // <---- not working well, it's look only for id.
switch (action.type) {
case "product":
const product = action.payload as ResourceData["product"]
return `product is ${product.name}`
case "order":
const order = action.payload as ResourceData["order"]
return `order is ${order.productId}`
case "user":
const user = action.payload as ResourceData["user"]
return `name is ${user.name}`
default:
return
}
}
const userAction: ResourceAction<"user"> = {
type: "user",
payload: { id: 1, name: "Alice", email: "alice@example.com" },
}
const productAction: ResourceAction<"product"> = {
type: "product",
payload: { id: 101, name: "Widget", price: 19.99 },
}
const orderAction: ResourceAction<"order"> = {
type: "order",
payload: { id: 1001, userId: 1, productId: 101, quantity: 3 },
}
console.log(fetchActionData(userAction))
console.log(fetchActionData(productAction))
console.log(fetchActionData(orderAction))
当我try 删除此代码时:
const product = action.payload as ResourceData['product'];
...并在Switch Case上创建新常量:
const actionPayload = action.payload as ResourceData[T]
使用后:
case "user":
return `name is ${actionPayload.name}`
TypeScrip引发以下错误:
Property 'name' does not exist on type '{ id: number; name: string; email: string; } | { id: number; name: string; price: number; } | { id: number; userId: number; productId: number; quantity: number; }'.
而当判断context
时,它只包含id
个字段.
为什么会发生这种情况,我如何才能修复它?