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}`);
这适用于 3 个元素,但不适用于任何(动态)数量的元素。
如何以通用方式为任意数量的元素键入此内容?
谢谢!
解决方案
您的数据表示数组的某些扩展,因此具有类似的泛型,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")
将给出 typestring
但bar("a")
给出 type "a"
,这是因为如果可能的话,打字稿会变得更具体以适应泛型约束,所以虽然Elems
在功能上与 相同[...Elems]
,但第一个被认为是数组类型,第二个被认为是元组类型,这就是为什么generic 以不同的方式解析,保留元组。