TypeScript 4.0开始支持可变元组类型的概念,这是一种很好的类型构造,可以在连接函数中使用。以下是来自文档的一个示例:
我对于这种类型构造能否用于为笛卡尔积函数进行类型标注很感兴趣。该函数应该能够根据其参数推断出(混合的)类型,并生成相应的返回类型。因此,如果我输入
我目前使用的实现不利用变长元组类型,需要显式类型转换:
我正在寻找一种不需要显式类型转换的解决方案,我认为可变元组类型可能是适当的类型构造。 问题 如何使用可变元组类型推断笛卡尔积函数的类型?
type Arr = readonly any[];
function concat<T extends Arr, U extends Arr>(arr1: T, arr2: U): [...T, ...U] {
return [...arr1, ...arr2];
}
我对于这种类型构造能否用于为笛卡尔积函数进行类型标注很感兴趣。该函数应该能够根据其参数推断出(混合的)类型,并生成相应的返回类型。因此,如果我输入
[number[], string[]]
,则期望输出的类型为[number, string][]
。在这个线程中可以找到多个笛卡尔积的实现,但没有一个是严格类型化的。以下是一个例子:const cartesian =
(...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));
我目前使用的实现不利用变长元组类型,需要显式类型转换:
const cartesian = <T extends any[]>(...arr: any[][]): T[] =>
arr.reduce<T[]>(
(a, b) => a.flatMap<T>(c => b.map<T>(d => [...c, d] as T)),
[[]] as T
);
const product = cartesian<[number, string]>([1, 2, 3], ['a', 'b', 'c']);
我正在寻找一种不需要显式类型转换的解决方案,我认为可变元组类型可能是适当的类型构造。 问题 如何使用可变元组类型推断笛卡尔积函数的类型?
function cartesian<A extends Array<Array<any>>>(...args: A): { [K in keyof A]: A[K] extends Array<any> ? A[K][number] : never }[];
,它对于数组来说是有效的,但你的解决方案绝对更好,因为它允许输入的“集合”可以是任何类型,而不仅仅是数组。 - undefined