我在类似的问题中找不到这个。
我试图输入一个元素数量未知的元组。
我知道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")
将给出类型,string
但bar("a")
给出type "a"
,这是因为如果可能的话,typescript将变得更加具体,以适合通用约束,因此虽然Elems
在功能上与相同[...Elems]
,但第一个被视为数组类型,第二个被视为元组类型,这就是为什么泛型的解析方式不同,保留了元组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句