能否用TypeScript条件类型根据对象/对象数组确定函数返回类型?
解决方案
你写的代码核心问题是误用了**运行时的Array.isArray()**做类型判断——TypeScript的条件类型是编译时逻辑,必须用类型层面的语法判断输入是否为数组类型,完全可以通过条件类型实现你的需求。
正确的条件类型写法
首先定义一个泛型条件类型,通过T extends any[]判断输入类型是否为数组:
// 限制输入只能是单个对象或对象数组,返回对应类型 type ObjectOrArray<T extends object | object[]> = T extends any[] ? T : T;
如果需要更精准地推断数组元素类型,可以加上infer关键字:
type ObjectOrArray<T extends object | object[]> = T extends Array<infer U> ? Array<U> : T;
结合函数的完整示例
把这个类型和函数结合,就能实现输入输出类型的对应:
function processInput<T extends object | object[]>(input: T): ObjectOrArray<T> { if (Array.isArray(input)) { // 处理对象数组,返回同类型数组 return input.map(item => ({ ...item, processed: true })) as ObjectOrArray<T>; } else { // 处理单个对象,返回同类型对象 return { ...input, processed: true } as ObjectOrArray<T>; } } // 测试场景1:输入单个对象,返回对象类型 const singleObj = processInput({ id: 1, name: "Alice" }); // singleObj 类型为 { id: number; name: string; processed?: boolean; } // 测试场景2:输入对象数组,返回数组类型 const objArray = processInput([{ id: 1 }, { id: 2 }]); // objArray 类型为 { id: number; processed?: boolean; }[]
关键注意点
- 泛型约束
T extends object | object[]确保输入只能是合法的对象/对象数组,避免传入其他类型 - 函数内部的
as ObjectOrArray<T>是类型断言,用来让TypeScript关联运行时分支和编译时的条件类型判断 - 条件类型的
T extends Array<infer U>会自动推断数组的元素类型U,保证返回数组的元素类型和输入完全匹配
内容的提问来源于stack exchange,提问作者Tim Woohoo
相关产品推荐
相关产品推荐

