Typescript 数组泛型问题

2021-01-13 22:51:16 +08:00
 Xheldon

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

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

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

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

或者

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

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

1686 次点击
所在节点    TypeScript
4 条回复
wsxyeah
2021-01-13 23:08:13 +08:00
function A(arr: [string, number, [number]]) {
return ["a", 1, [1]] as typeof arr
}

这样吗?
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
2021-01-14 10:47:27 +08:00
@wsxyeah 不只是三个,如果有 N 个参数呢
Xheldon
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[] {}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX