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

