如何用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
相关产品推荐
相关产品推荐

