如何定义泛型类型GetAppActions:根据T值显示对应data属性
泛型类型GetAppActions的字段约束实现
需求明确:泛型参数T为'trigger'时,data属性仅包含trigger字段;T为'action'时,data属性仅包含action字段。可以通过条件类型+交叉类型实现该约束,修改后的代码如下:
type GetAppActionType = 'trigger' | 'action' interface AppActionInputField {} type GetAppActions<T extends GetAppActionType = GetAppActionType> = { type: T; } & (T extends 'trigger' ? { data: { trigger: { inputFields: AppActionInputField[] } } } : { data: { action: { inputFields: AppActionInputField[] } } })
实现说明
- 泛型约束:通过
T extends GetAppActionType限定T只能取'trigger'或'action',避免传入非法类型 - 条件分支:利用
T extends 'trigger' ? ... : ...动态匹配data结构:- 当
T为'trigger'时,data仅保留trigger字段 - 当
T为'action'时,data仅保留action字段
- 当
- 交叉合并:用
&将固定的type字段与动态生成的data结构合并,得到最终类型
使用示例
// 合法:T为'trigger',data仅包含trigger字段 const triggerAction: GetAppActions<'trigger'> = { type: 'trigger', data: { trigger: { inputFields: [] } } } // 合法:T为'action',data仅包含action字段 const actionAction: GetAppActions<'action'> = { type: 'action', data: { action: { inputFields: [] } } } // 非法:T为'trigger'却传入action字段,TypeScript会报错 // const invalidAction: GetAppActions<'trigger'> = { // type: 'trigger', // data: { // action: { inputFields: [] } // } // }
内容的提问来源于stack exchange,提问作者Alikhani
相关产品推荐
相关产品推荐

