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

如何基于字段值判断TypeScript接口类型并创建对应对象

解决方案:用类型映射+泛型实现通用工作流步骤存储

核心思路

通过TypeScript的类型映射和泛型,把工作流类型与对应步骤接口做绑定,再借助Object.assign实现UI字段到目标对象的动态赋值,完全不用为每个接口创建类,也不用写重复的存储方法。

具体实现步骤

1. 定义基础类型与接口

先把所有工作流的步骤接口、工作流类型联合类型定义好,再建立类型映射关系:

// 各工作流第一步的接口定义
interface FirstStepWorkflowA {
  name: string;
  age: number;
}

interface FirstStepWorkflowB {
  projectId: string;
  teamSize: number;
}

// 工作流类型的联合类型
type WorkflowType = 'WorkflowA' | 'WorkflowB';

// 关键:建立工作流类型到对应步骤接口的映射
type WorkflowStepMapping = {
  WorkflowA: FirstStepWorkflowA;
  WorkflowB: FirstStepWorkflowB;
};

2. 改造WorkflowRequest类

让类内部的成员变量支持存储不同工作流的步骤数据,同时实现通用的存储方法:

class WorkflowRequest {
  // 用Partial+Record来存储各工作流的步骤数据,初始为空对象
  private workflowStepData: Partial<Record<WorkflowType, WorkflowStepMapping[WorkflowType]>> = {};

  // 通用的第一步存储方法,泛型T约束为WorkflowType,确保类型安全
  saveFirstStepInfo<T extends WorkflowType>(
    workflowType: T,
    uiInput: Partial<WorkflowStepMapping[T]>
  ): void {
    // 先初始化对应工作流的步骤数据(避免undefined)
    if (!this.workflowStepData[workflowType]) {
      this.workflowStepData[workflowType] = {} as WorkflowStepMapping[T];
    }
    // 把UI传入的字段合并到目标对象里
    Object.assign(this.workflowStepData[workflowType], uiInput);
  }

  // 可选:获取指定工作流的第一步数据
  getFirstStepData<T extends WorkflowType>(workflowType: T): WorkflowStepMapping[T] | undefined {
    return this.workflowStepData[workflowType];
  }
}

3. 使用示例

调用通用方法时,TypeScript会自动根据传入的workflowType校验UI输入的字段是否符合对应接口:

const request = new WorkflowRequest();

// 存储WorkflowA的第一步数据
request.saveFirstStepInfo('WorkflowA', { name: 'Isabelle', age: 28 });
// 存储WorkflowB的第一步数据
request.saveFirstStepInfo('WorkflowB', { projectId: 'TS-DEV-001', teamSize: 5 });

// 获取数据
console.log(request.getFirstStepData('WorkflowA')); // { name: 'Isabelle', age: 28 }
console.log(request.getFirstStepData('WorkflowB')); // { projectId: 'TS-DEV-001', teamSize: 5 }

额外优化点

  • 如果需要强制UI输入包含接口的必填字段,可以把Partial<WorkflowStepMapping[T]>改成原接口类型,要求传入完整数据。
  • 可以在saveFirstStepInfo里加字段校验逻辑,比如判断必填字段是否存在,避免空值流入。

内容的提问来源于stack exchange,提问作者IsabelleT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:30:18