gpt4 book ai didi

typescript :如何输入不同类型的未知大小的元组?

转载 作者:行者123 更新时间:2023-12-04 02:31:34 25 4
gpt4 key购买 nike

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

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

尽管我阅读了 the docs,但我无法理解它

这个例子很简单:


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}`);

Typescript playground link

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

谢谢!

最佳答案

你的数据代表数组的一些扩展,所以有一个像 Elems extends unknown[] 这样的泛型,那么诀窍是指定 [...Elems] 作为第一个参数而不仅仅是 Elems 这表明 typescript 应该尝试保留输入的任何元组性*:

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}`);

( playground link )

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

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

调用 foo("a") 将给出类型 stringbar("a") 给出类型 "a",这是因为如果可能的话,typescript 将变得更加具体以适应通用约束,因此虽然 Elems 在功能上与 [...Elems] 相同,但第一个被认为是数组类型,第二个被认为是元组类型,这就是泛型以不同方式解析的原因,保留了元组特性。

关于 typescript :如何输入不同类型的未知大小的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63891119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com