4

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

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

[string, number]

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

[() => string, () => number]

我尝试的是keyof使用用法制作类型别名:

type tupleTransform<T extends Array<any>> = { [U in keyof T ]: (() => T[U]) };

它几乎可以工作,除了它还会检查方法,Array所以如果我要做:

const tupleTransformer: tupleTransform<[string, number]> = [() => 'a', () => 5]

它会触发我的错误,例如某些方法没有返回正确的类型

4

1 回答 1

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] 
}

它使用条件类型来区分数组方法和元组数字字符串索引。

让我们确保它有效:

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()); 

在我看来没问题。它可能以某种微妙的方式与“真实”元组不同,因此请注意购买者。希望有帮助。祝你好运!

于 2018-07-03T19:38:44.443 回答