打字稿:如何键入大小未知的不同类型的元组?

Ben*_*Ben 3 typescript

我在类似的问题中找不到这个。

我正在尝试输入一个元素数量未知的元组。
我知道 Typescript 4 添加了对可变元组的支持

尽管我阅读了文档,但我无法理解它

例子很简单:


function map<S, T, U, Z>(values: [S, T, U], mapper: (s: S, t: T, u: U) => Z): Z {
    return mapper(...values);
}


const v = map([1, 'hello', 3], (s, t, u) => `${s + t + u}`);
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场链接

这适用于 3 个元素,但不适用于任何(动态)数量的元素。
如何以通用方式为任意数量的元素键入此内容?

谢谢!

Tad*_*sen 6

你的数据代表了一个数组的一些扩展,所以有一个泛型,Elems extends unknown[]然后诀窍是指定[...Elems]为第一个参数,而不是仅仅Elems这表明打字稿它应该尝试保留输入的任何元组性*:

function map<Elems extends unknown[],  Z>(values: [...Elems], mapper: (...args: Elems) => Z): Z {
    return mapper(...values);
}


const v = map([1, 'hello', 3], (s, t, u) => `${s + t + u}`);
Run Code Online (Sandbox Code Playgroud)

游乐场链接

*当我说它保留元组性时,如果我有两个这样的函数,这只是通用解析工作方式的一个副产品:

function foo<T               >(arg: T){ return arg; }
function bar<T extends string>(arg: T){ return arg; }
Run Code Online (Sandbox Code Playgroud)

调用foo("a")将给出 typestringbar("a")给出 type "a",这是因为如果可能的话,打字稿会更具体地适应泛型约束,所以虽然Elems在功能上与 相同[...Elems],但第一个被认为是数组类型,第二个被认为是元组类型,这就是为什么generic 解析不同,保留元组性。