假设我有一个函数,参数是一个数组,如何重载函数来保证返回的值也是数组中的每个值的类型? 如:
A(['a', 1, [1]]) // 返回 ['aa', 11, [1, 1]](只是举个例子)
我知道如果参数中的类型是同一种类型则比较好写,如:
function A<T>(arr: T[]): T[] {}
或者
function A<T>(arr: Array<T>): Array<T> {}
即可。但是没有想明白如果参数数组中的类型是任意的该如何写?
1
wsxyeah 2021-01-13 23:08:13 +08:00
function A(arr: [string, number, [number]]) {
return ["a", 1, [1]] as typeof arr } 这样吗? |
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]) |
4
Xheldon OP @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[] {} ``` |