关键词: TypeScript, TypeChallenge
实现Diff
类, 接受两个类型作为参数, 返回二者不同名的属性的集合
举个栗子
type A = {
foo: string;
bar: number;
a: Function;
};
type B = {
foo: string;
bar: boolean;
b: symbol;
};
type D = Diff<A, B>;
/*
type D = {
a: Function;
b: symbol;
}
*/
type Diff<A, B> = {
[K in keyof A | keyof B as Exclude<K, keyof A & keyof B>]:
K extends keyof A
? A[K]
: K extends keyof B
? B[K]
: never;
};
将keyof A
记作Ak
, keyof B
记作Bk
Ak
与Bk
的并集 减去 Ak
与Bk
的交集 即为二者不同的属性名, 对于其中的每一个属性, 判断它是来自A
还是来自B
, 据此找出其来源的类型并使用之即可
type Diff<A, B> = {
// A B 的交集
// -----------------------------------∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
[K in keyof A | keyof B as Exclude<K, keyof A & keyof B>]:
// ---^^^^^^^^^^^^^^^^^
// A B 的并集
K extends keyof A // 如果来自 A
? A[K] // 取 A 中对应的类型
: K extends keyof B // 如果来自 B
? B[K] // 取 A 中对应的类型
: never; // 不可能到这一步