使用类似keyof的方法进行TypeScript数组类型转换

时间:2018-07-03 19:15:24

标签: javascript arrays typescript keyof

我正在尝试实现一种将具有指定值类型的数组类型克隆为具有返回指定值的函数的数组。

假设我们有如下数组元组:

*data.map { it.unit!! }.toTypedArray()

我想要从中获取生成的类型,例如:

[string, number]

我试图用[() => string, () => number] 的用法制作类型别名:

keyof

它几乎可以工作,除了它还检查type tupleTransform<T extends Array<any>> = { [U in keyof T ]: (() => T[U]) }; 的方法,所以我是否要这样做:

Array

例如某些方法未返回正确的类型

1 个答案:

答案 0 :(得分:5)

认为,您可以执行以下操作:

type TupleTransform<T extends any[]> = { [K in keyof T]:
    K extends "length" ? T[K] :
    K extends keyof any[] ? Array<() => T[number]>[K] :
    () => T[K] 
}

它使用conditional types来区分数组方法和元组数字字符串索引。

让我们确保它能起作用:

const tupleTransformer: TupleTransform<[string, number]> = [() => 'a', () => 5] //okay
const t0: () => string = tupleTransformer[0]
const t1: () => number = tupleTransformer[1]
const len: 2 = tupleTransformer.length;
const mapped: (string | number)[] = tupleTransformer.map(x => x()); 

我可以。它可能与“真实的”元组在某些细微的方面有所不同,因此请警告。希望能有所帮助。祝你好运!