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

如何用TypeScript泛化参数,让函数支持对象或数组类型?

解决方案

你遇到的Type 'Object' is not generic.(2315)错误是因为TypeScript中的Object全局类型并非泛型类型,不能用Object<T>这样的写法。下面是改造后的实现,满足接收对象或数组参数、通过泛型约束类型的需求:

步骤1:定义泛型约束类型

先定义一个基础约束,确保输入的对象(或数组元素)必须包含name属性:

interface HasName {
  name: string;
}

步骤2:实现支持对象/数组的泛型函数

通过函数重载可以清晰区分两种输入场景的类型逻辑:

// 重载签名:处理单个带name属性的对象
function search<T extends HasName>(value: T): T['name'];
// 重载签名:处理带name属性的对象数组
function search<T extends HasName>(value: T[]): T['name'][];
// 函数核心实现
function search<T extends HasName>(value: T | T[]): string | string[] {
  if (Array.isArray(value)) {
    return value.map(item => item.name);
  }
  return value.name;
}

// 测试用例
const v1 = {name:'name1', age:12}
const v2 = {name:'name2', city:'chennai'}
const v3 = {name:'name3', village:'Madukarai'}

// 单个对象调用,返回string类型
const getSearch1 = search(v1);
const getSearch2 = search(v2);
// 数组调用,返回string[]类型
const getSearchArray = search([v1, v2, v3]);

代码说明

  • HasName接口作为泛型约束,确保所有输入的对象都必须有name属性,避免访问value.name时出现类型错误。
  • 函数重载明确了两种输入对应的返回值类型,TypeScript会自动推导返回值类型,无需手动指定泛型参数(若需要手动指定,可写search<typeof v1>(v1))。
  • 实现部分通过Array.isArray判断输入类型,分别处理单个对象和数组的逻辑。

简化版(无函数重载)

如果不需要严格区分返回值类型的推导,也可以直接用联合类型定义参数:

function search<T extends HasName>(value: T | T[]): string | string[] {
  return Array.isArray(value) ? value.map(i => i.name) : value.name;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:30:54