打字稿根据操作类型获取正确的类型

时间:2019-02-20 17:14:46

标签: typescript

我具有以下函数,该函数采用唯一的动作来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情况下,我没有自动完成功能。我该如何实现?

1 个答案:

答案 0 :(得分:2)

即使action === Actions.A,也不足以确保类型params实际上是ActionOne。编译器无法确定是否在应用程序的其他位置没有定义其他类似的动作:

interface ActionThree extends Action {
  action: Actions.A,
  payload: {
    foo: string;
  }
}

您需要建议编译器您的switch语句详尽无遗。尝试像这样编写最终的函数签名:

function startAction(params: ActionOne | ActionTwo) {
  ...
}
相关问题