一.Diff 实现
求两个对象不同的部分
let person1 = {
name: "james",
age: 18,
address: "深圳"
};
let person2 = {
address: "深圳"
};
type Diff<T extends object, K extends object> = Omit<T, keyof K>;
// 取差异,以person1为准
type DiffPerson = Diff<typeof person1, typeof person2>;
// type DiffPerson = {
// name: string;
// age: number;
// }
二.InterSection 交集
let person1 = {
name: "james",
age: 11,
address: "深圳",
};
let person2 = {
address: "深圳",
};
type InterSection<T extends object, K extends object> = Pick<
T,
// 抽取公共类型
Extract<keyof T, keyof K>
>;
type InterSectionPerson = InterSection<typeof person1, typeof person2>;
// type InterSectionPerson = {
// address: string;
// }
三.Overwrite 属性覆盖
type OldProps = { name: string; age: number; visible: boolean };
type NewProps = { age: string; other: string };
// 差集
type Diff<T extends object, K extends object> = Omit<T, keyof K>;
// 交集
type InterSection<T extends object, K extends object> = Pick<
T,
Extract<keyof T, keyof K>
>;
// 属性覆盖
type Overwrite<
T extends object,
K extends object,
I = Diff<T, K> & InterSection<K, T> // 差集 & 交集 => 并集
> = Pick<I, keyof I>; // 筛选
type ReplaceProps = Overwrite<OldProps, NewProps>;
// type ReplaceProps = {
// name: string;
// age: string;
// visible: boolean;
// }
如果存在已有属性则使用新属性类型进行覆盖操作
四.Merge 对象合并
type OldProps = { name: string; age: number; visible: boolean };
type NewProps = { age: string; other: string };
type Compute<A extends any> = { [K in keyof A]: A[K] };
// (1)Omit<T, keyof K>: 先忽略掉 K 的所有属性
// (2)Omit<T, keyof K> & K 然后再合并
type Merge<T, K> = Compute<Omit<T, keyof K> & K>;
type MergeObj = Merge<OldProps, NewProps>;
// type MergeObj = {
// name: string;
// visible: boolean;
// age: string;
// other: string;
// }
将两个对象类型进行合并操作