使用 keyof 之类的方法进行 TypeScript 数组类型转换
TypeScript array type transform with keyof like method
我正在尝试实现类似于将具有指定值类型的一种数组类型克隆为具有 return 指定值的函数的数组。
假设我们有这样的数组元组:
[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]
它会触发我的错误,例如某些方法不是 return 正确的类型
我认为你可以这样做:
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());
我觉得还可以。它可能以某种微妙的方式与 "real" 元组不同,所以买者自负。希望有所帮助。祝你好运!
我正在尝试实现类似于将具有指定值类型的一种数组类型克隆为具有 return 指定值的函数的数组。
假设我们有这样的数组元组:
[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]
它会触发我的错误,例如某些方法不是 return 正确的类型
我认为你可以这样做:
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());
我觉得还可以。它可能以某种微妙的方式与 "real" 元组不同,所以买者自负。希望有所帮助。祝你好运!