我有一个打印脚本的对象列表,我想确保它们的键在compile-time处是唯一的.
例如:
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const obj3 = { e: 5, f: 6 };
const obj4 = { a: 7, g: 8 }; // 'a' is duplicated
我能够编写一个TS函数来确保任意两个对象之间的唯一性:
declare function ensureUniqueKeys<
A,
B extends { [K in keyof B]: K extends keyof A ? never : B[K] },
>(a: A, b: B): unknown;
ensureUniqueKeys(obj1, obj2); // no issues
ensureUniqueKeys(obj1, obj4); // Error: Types of property 'a' are incompatible.
但我想不出一种方法来处理任意的对象列表.
我一直在try 编写某种递归判断器,但它从未报告任何错误:
type EnsureUniqueKeys<T extends string[], PreviousKeys = never> = T extends [
infer First,
...infer Rest,
]
? First extends object
? Rest extends string[]
? keyof First extends PreviousKeys
? never // Overlap detected, trigger a compile-time error
: EnsureUniqueKeys<Rest, PreviousKeys | keyof First>
: never
: never
: unknown;
declare function ensureUniqueKeysRecursive<T extends string[]>(...objects: EnsureUniqueKeys<T>[]): unknown;
ensureUniqueKeysRecursive(obj1, obj2, obj3, obj4); // No errors :(
再说一次:我知道这可以在运行时很容易地完成,但我需要它来判断compile-time的唯一性.