TypeScript数组类型转换与keyof like方法

Tha*_*Fog 4 javascript arrays typescript keyof

我正在尝试实现类似于具有指定值类型的一个数组类型的克隆,作为具有返回指定值的函数的数组.

假设我们有数组元组:

[string, number]
Run Code Online (Sandbox Code Playgroud)

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

[() => string, () => number]
Run Code Online (Sandbox Code Playgroud)

我试过的是keyof使用类型别名:

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

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

const tupleTransformer: tupleTransform<[string, number]> = [() => 'a', () => 5]
Run Code Online (Sandbox Code Playgroud)

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

jca*_*alz 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] 
}
Run Code Online (Sandbox Code Playgroud)

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

让我们确保它有效:

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()); 
Run Code Online (Sandbox Code Playgroud)

看起来对我好.它可能会以某种微妙的方式与"真正的"元组不同,因此需要注意.希望有所帮助.祝好运!