【发布时间】:2021-03-09 12:46:44
【问题描述】:
TypeScript 4.0 开始支持Variadic Tuple Types 的概念,这是一个很好的类型构造,可以用于例如串联函数。文档中的一个示例:
type Arr = readonly any[];
function concat<T extends Arr, U extends Arr>(arr1: T, arr2: U): [...T, ...U] {
return [...arr1, ...arr2];
}
我对这种类型构造是否可用于键入Cartesian Product 函数感兴趣。然后,该函数应从参数中推断(混合)类型以产生其返回类型。因此,如果我输入[number[], string[]],我希望输出的类型为[number, string][]。笛卡尔积的多个实现可以在this thread 中找到,但没有一个是严格键入的。这是一个例子:
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']);
我正在寻找一个没有显式类型转换的解决方案,我认为 Variadic Tuple Types 可能是这里合适的类型构造。
问题
如何使用可变元组类型推断笛卡尔积函数的类型?
【问题讨论】:
标签: typescript cartesian-product typescript4.0 variadic-tuple-types