首页 > 解决方案 > 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情况下,我没有自动完成的能力。我怎样才能实现它?

标签: typescript

解决方案


即使action === Actions.A,这还不足以确保类型params实际上是ActionOne。编译器不能确定在您的应用程序的其他地方没有像这样定义的其他操作:

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

您需要说服编译器您的 switch 语句是详尽的。尝试像这样编写最终的函数签名:

function startAction(params: ActionOne | ActionTwo) {
  ...
}

推荐阅读