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

能否用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:24:59