我具有以下函数,该函数采用唯一的动作来params
对象:
enum Actions {
A,
B
}
interface Action {
name: string;
action: Actions;
}
interface ActionOne extends Action {
action: Actions.A,
payload: {
a: number;
}
}
interface ActionTwo extends Action {
action: Actions.B,
payload: {
a: number;
b: string;
}
}
function startAction(params: ActionOne)
function startAction(params: ActionTwo);
function startAction(params: Action) {
switch (params.action) {
case Actions.A:
params. // I want autocomplete based on the type
return;
case Actions.B:
params. // I want autocomplete based on the type
return;
}
}
startAction({ name: '', action: Actions.A, payload: { a: 1 } });
startAction({ name: '', action: Actions.B, payload: {a: 1, b: 'ds'} })
当我调用startAction
方法时,我基于传递的action
得到正确的自动完成功能。但是,在switch
情况下,我没有自动完成功能。我该如何实现?
答案 0 :(得分:2)
即使action === Actions.A
,也不足以确保类型params
实际上是ActionOne
。编译器无法确定是否在应用程序的其他位置没有定义其他类似的动作:
interface ActionThree extends Action {
action: Actions.A,
payload: {
foo: string;
}
}
您需要建议编译器您的switch语句详尽无遗。尝试像这样编写最终的函数签名:
function startAction(params: ActionOne | ActionTwo) {
...
}