如何对使用相同泛型元组类型的所有函数参数强制执行元组长度



[number, number] | [number]扩展[number, ...number[]]是有道理的,但我想知道是否有一种方法可以基于第一个参数强制执行元组长度,以便第二个元组必须使用相同的长度。

function addVectors<T extends [number, ...number[]]>(v1: T, v2: T) {
// not implemented
}
// T becomes [number].
addVectors([1], [2]);
// T becomes [number, number] | [number].
addVectors([1, 3], [3]);

我想阻止这个编译:

addVectors([1, 3], [3]);

有可能在TypeScript中实现这一点吗?

我通过创建第二个类型参数来实现它,该参数扩展了第一个类型:

function addVectors<T extends [number, ...number[]], U extends T>(v1: T, v2: U) {
// not implemented
}
// T becomes [number].
addVectors([1], [2]);
// Does not compile.
// "Argument of type '[number]' is not assignable to parameter of type '[number, number]'".
addVectors([1, 3], [3]);

我更进一步,让addVectors接受两个或多个相同维度的向量:

function addVectors<T extends [number, ...number[]], U extends T>(...vectors: [T, U, ...U[]]) {
// not implemented
}
addVectors([1], [2]);
addVectors([1, 1], [2, 2], [3, 3]);
// Does not compile.
addVectors([1, 1], [2, 2], [3, 3], [4, 4, 4]);

最新更新