我正在尝试编写一个函数,该函数将使用一系列初始化函数及其选项。我能够从函数中导出选项的类型,因此我认为我应该能够检查我提供的选项是否具有相同的类型。
该示例是此版本的最小化版本。我认为每个数组项都需要一个独立的泛型,但是我显然不知道数组的大小。
type O<T> = { a: T }
type E<T> = [O<T>, T]
const f = <T={}>(array: E<T>[]) => {}
f([
[{ a: 4 }, 4], //Works
[{ a: "5" }, "5"] //Doesn't work as T is set to number
])
答案 0 :(得分:0)
type O = { a: any }
type E<T extends O[]> = {
[P in keyof T]: T[P] extends T[number] ? [T[P], T[P]["a"]] : never;
}
const f = <T extends O[]>(...args: E<T>) => { }
或更笼统地说:
type E<T extends {}[], K extends keyof T[number]> = {
[P in keyof T]: T[P] extends T[number] ? [T[P], T[P][K]] : never;
}
const f = <T extends O[]>(...args: E<T, "a">) => { }
应该注意的是,如果不使用rest参数,我将无法正常工作。
一旦我不再过多地关注每个元素的单个泛型,便使用了我设法获得的映射类型:
type E<T extends { a: any }[]> = {
[P in keyof T]: [T[P], T[P]["a"]]
}
但是出现错误:类型'“ a”'不能用于索引类型'T [P]'。
事实证明是因为对元组使用keyof包含非数字键(例如'length')。我在Typescript Github issue上找到了解决方案;只检查数字键。