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

如何让TypeScript泛型类型推断为多个参数类型的联合类型?

解决TypeScript泛型自动推断联合类型的问题

你当前的merge函数泛型T要求所有传入的子数组必须是同一种Array<T>类型,所以当传入number[]和string[]时,TypeScript无法找到一个同时兼容两者的T,导致类型错误。要实现自动推断所有子数组元素类型的联合,需要调整泛型的定义方式:

function merge<T extends readonly any[][]>(arr: T): Array<T[number][number]> {
  return arr.reduce((acc, curr) => [...acc, ...curr], [] as Array<T[number][number]>);
}

// 调用示例,无需手动指定类型
const a = merge([
  [1, 2, 3],
  ['1', '2'],
]);
// a的类型自动推断为Array<number | string>

代码说明:

  • 泛型T被定义为只读任意数组的数组,可以匹配包含不同类型子数组的输入;
  • T[number]表示取T中所有子数组的类型(这里是number[] | string[]);
  • T[number][number]进一步提取所有子数组的元素类型,得到联合类型number | string;
  • 返回值类型指定为Array<T[number][number]>,确保返回数组的元素类型是所有输入子数组元素类型的联合。

你也可以用更简洁的方式定义泛型,直接捕获元素类型的联合:

function merge<U>(arr: readonly (readonly U[])[]): U[] {
  return arr.reduce((acc, curr) => [...acc, ...curr], [] as U[]);
}

const a = merge([
  [1, 2, 3],
  ['1', '2'],
]);
// U自动推断为number | string,返回类型为Array<number | string>

这种写法中,TypeScript会自动将U推断为所有子数组元素类型的联合,因为readonly U[]需要兼容传入的number[]和string[],所以U只能是number | string。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:18:15