V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Xheldon
V2EX  ›  TypeScript

Typescript 数组泛型问题

  •  
  •   Xheldon · 2021-01-13 22:51:16 +08:00 · 1686 次点击
    这是一个创建于 1407 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设我有一个函数,参数是一个数组,如何重载函数来保证返回的值也是数组中的每个值的类型? 如:

    A(['a', 1, [1]]) // 返回 ['aa', 11, [1, 1]](只是举个例子)
    

    我知道如果参数中的类型是同一种类型则比较好写,如:

    function A<T>(arr: T[]): T[] {}
    

    或者

    function A<T>(arr: Array<T>): Array<T> {}
    

    即可。但是没有想明白如果参数数组中的类型是任意的该如何写?

    4 条回复    2021-01-14 12:40:12 +08:00
    wsxyeah
        1
    wsxyeah  
       2021-01-13 23:08:13 +08:00
    function A(arr: [string, number, [number]]) {
    return ["a", 1, [1]] as typeof arr
    }

    这样吗?
    love
        2
    love  
       2021-01-13 23:10:12 +08:00
    declare function A<T extends any[]>(arr: readonly [...T]): T

    let aaa = A([1, '2', false])
    Xheldon
        3
    Xheldon  
    OP
       2021-01-14 10:47:27 +08:00
    @wsxyeah 不只是三个,如果有 N 个参数呢
    Xheldon
        4
    Xheldon  
    OP
       2021-01-14 12:40:12 +08:00
    @love 这样是可以的,但是又一个蛋疼的问题是我需要知道 T 数组中的每个类型,因为参数中需要用到该类型来指示。。。-_-!
    比如如果只有一个类型是这样的:

    ```js
    function A<T>(key: B<T>): T[] {}
    ```

    如果 T 是个数组,B 就拿不到 T 中的类型,然后就没法儿指示返回值数组中的每个类型了。搜了一圈,似乎 ts 在编译节点不可能拿到运行时才确定的参数类型,比较尴尬。用你写的方法需要有个类似 valueof 的关键字,来获取 T 数组中的每个元素类型,语法类似于:

    ```js
    function A<T extends any[]>(key: B<valueof T>): T[] {}
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:12 · PVG 21:12 · LAX 05:12 · JFK 08:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.