You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义泛型类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:15:42