首页 > 解决方案 > 打字稿:如何键入具有不同类型的未知大小的元组?

问题描述

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

我正在尝试输入一个包含未知数量元素的元组。
我知道 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}`);

打字稿游乐场链接

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

谢谢!

标签: typescript

解决方案


您的数据表示数组的某些扩展,因此具有类似的泛型,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}`);

游乐场链接

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

function foo<T               >(arg: T){ return arg; }
function bar<T extends string>(arg: T){ return arg; }

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


推荐阅读