Typescript 从入门到放弃系列(十五)-自定义类型

375 阅读1分钟

一.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;
// }

将两个对象类型进行合并操作