【问题标题】:Typescript: How can I type tuples of unknown size with varying types?打字稿:如何键入具有不同类型的未知大小的元组?
【发布时间】:2020-09-15 05:40:57
【问题描述】:

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

我正在尝试输入一个包含未知数量元素的元组。
我知道 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 个元素,但不适用于任何(动态)数量的元素。
如何以通用方式为任意数量的元素键入此内容?

谢谢!

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您的数据表示数组的某些扩展,因此有一个像Elems extends unknown[] 这样的泛型,那么诀窍是将[...Elems] 指定为第一个参数,而不仅仅是Elems,这表明它应该尝试保留任何元组-输入的ness*:

    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)

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

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

    调用foo("a") 将给出string 类型,但bar("a") 给出"a" 类型,这是因为如果可能的话,打字稿将变得更具体以适应通用约束,所以虽然Elems 在功能上与@987654332 相同@,第一个被认为是数组类型,第二个被认为是元组类型,这就是泛型解析不同的原因,保留元组。

    【讨论】:

    • 完美!!我认为any[] 让我失望,但我明白,虽然它是any,但打字稿会跟踪实际类型
    • 感谢您阐明如何与 [...Elems] 和 Typescript 一起使用
    • 是的,作为泛型的约束,它可能应该是unknown[],但它代表基本类型,它保留实际类型,但验证它必须可以分配给约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2022-01-05
    • 2018-11-03
    相关资源
    最近更新 更多