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

如何编写支持多对象输入的TypeScript通用函数?

当然可以,两种方案都能实现你的需求,下面分别说明:

方案一:泛型函数(推荐,更符合TypeScript类型安全特性)

如果Object set A和Object set B有共同属性/方法,可以通过泛型约束复用核心逻辑;即便结构差异较大,也能结合联合类型让函数兼容两者。

举个实际代码示例:
先定义两个对象类型:

// Object set A
type ObjectA = {
  id: number;
  name: string;
  type: 'A';
};

// Object set B
type ObjectB = {
  id: number;
  label: string;
  type: 'B';
};

带约束的泛型实现

利用两者共有的id属性做泛型约束,同时通过类型守卫处理差异逻辑:

function processObject<T extends { id: number }>(obj: T) {
  // 复用的核心逻辑,比如基于id做统一处理
  console.log(`Processing object with id: ${obj.id}`);
  
  // 针对不同对象类型做差异化处理
  if ('name' in obj) {
    console.log(`Object A name: ${obj.name}`);
  } else if ('label' in obj) {
    console.log(`Object B label: ${obj.label}`);
  }
}

// 两种对象都能直接传入
processObject({ id: 1, name: 'Test A', type: 'A' });
processObject({ id: 2, label: 'Test B', type: 'B' });

简化联合类型实现

如果只是需要函数兼容两种类型输入,也可以直接用联合类型(本质是泛型的简化形式):

function processObject(obj: ObjectA | ObjectB) {
  console.log(`Processing object with id: ${obj.id}`);
  // 通过字面量类型做精准判断
  if (obj.type === 'A') {
    console.log(obj.name);
  } else {
    console.log(obj.label);
  }
}
方案二:多参数分支判断(适合逻辑差异较大的场景)

如果需要同时接收多个对象参数,或者不同对象的处理逻辑差异明显,可以用if-else结合类型守卫实现:

function processObjects(...objs: (ObjectA | ObjectB)[]) {
  objs.forEach(obj => {
    if (obj.type === 'A') {
      // Object A专属逻辑
      console.log(`Handling Object A: ${obj.name}`);
    } else {
      // Object B专属逻辑
      console.log(`Handling Object B: ${obj.label}`);
    }
    // 两者共用的逻辑放在这里
    console.log(`Common logic for id: ${obj.id}`);
  });
}

// 支持传入混合类型的参数
processObjects(
  { id: 1, name: 'A1', type: 'A' },
  { id: 2, label: 'B1', type: 'B' }
);

注意:使用分支判断时,要确保TypeScript能通过类型守卫(比如in操作符、字面量类型判断、自定义类型守卫函数)正确推断类型,避免出现类型错误。

总结:核心逻辑复用度高时,优先用泛型+类型守卫;逻辑分支差异大或需处理多参数时,联合类型+if-else分支更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:16