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']);
我正在寻找一种无需显式类型转换的解决方案,并且我认为可变元组类型可能是这里合适的类型构造。
Question
如何使用可变元组类型来推断笛卡尔积函数的类型?