【发布时间】:2019-10-30 15:14:30
【问题描述】:
我有一个函数的类型定义。我将第二个参数的类型定义为以第一个参数的类型为条件,如下所示:
const FOO = "FOO";
const BAR = "BAR";
let fooPayload = {
zip: "zap"
}
let barPayload = {
cat: "dog"
}
type ActionTypes = typeof FOO | typeof BAR;
interface MyFunction<T extends ActionTypes = ActionTypes> {
(
action: {
type: T;
payload: T extends typeof FOO
? typeof fooPayload
: typeof barPayload;
}
): boolean;
}
MyFunction 接口引用的函数内部有一个 switch 语句,该语句基于 action.type 进行切换,并根据情况对action.payload 执行某些操作。这是一个例子:
const myFunction:MyFunction = (action) => {
switch (action.type) {
case FOO:
action.payload.zip = "new zap"
return true
case BAR:
action.payload.cat = "new dog"
return false
default:
return false
}
}
我遇到的问题是 Typescript 没有正确地从 switch 语句中推断出 action.payload 应该是什么。例如,如果action.type 等于“FOO”,那么它应该推断出action.payload 必须是typeof fooPayload。相反,它推断它是typeof fooPayload | typeof barPayload。
这没有任何意义,因为action.payload 的类型定义基于action.type 的值,并且因为action.payload.zip 是在switch 语句中调用的只有在@987654335 时才会发生@ 等于“FOO”,它应该推断出action.payload 唯一可能的类型是typeof fooPayload。
我在这里做错了什么?
【问题讨论】:
标签: typescript