typescript - 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
情况下,我没有自动完成的能力。我怎样才能实现它?
解决方案
即使action === Actions.A
,这还不足以确保类型params
实际上是ActionOne
。编译器不能确定在您的应用程序的其他地方没有像这样定义的其他操作:
interface ActionThree extends Action {
action: Actions.A,
payload: {
foo: string;
}
}
您需要说服编译器您的 switch 语句是详尽的。尝试像这样编写最终的函数签名:
function startAction(params: ActionOne | ActionTwo) {
...
}
推荐阅读
- react-hooks - 没有样板的 React 自定义钩子用于关闭
- reporting-services - 条件颜色的 SSRS 切换功能
- android - 在 Unity3D 构建中包含 AndroidManifest.xml 会导致移动应用程序立即崩溃
- vba - 使用 VBA 保存在 xmlhttprequest 中的授权数据
- node-red - 如何过滤仪表上的数字?
- python - 用 Django 实现搜索表单
- anylogic - 测量路口延迟时间
- excel - 创建自动生成的工作表菜单
- elasticsearch - 使用 Open Distro 在 Elasticsearch 中禁用状态管理历史记录
- c# - IUrlHelper.Action() 为 Delete() 操作方法返回 null