Skip to content

Latest commit

 

History

History
47 lines (37 loc) · 1.34 KB

DeepOmit.md

File metadata and controls

47 lines (37 loc) · 1.34 KB
标题 标签
DeepOmit(深度去除对象属性) extends(继承)

深度去除对象属性。

  • 定义 K 为对象的属性,然后将 K 断言成如果 K 是给定属性,则返回 never,否则返回 K。
  • 属性值基于属性 K 判断,如果 K 是给定属性,则返回 never,如果给定属性 P 属于点构成的模板字符串,则依次读取点构成的属性,递归。
  • 否则返回原本属性值。

代码如下:

type DeepOmit<T, P> = {
  [K in keyof T as K extends P ? never : K]: K extends P
    ? never
    : P extends `${infer F}.${infer R}`
    ? K extends F
      ? DeepOmit<T[K], R>
      : T[K]
    : T[K];
};

使用方式:

type TestObj = {
  person: {
    name: string;
    age: {
      value: number;
    };
  };
};

type DeepOmitRes1 = DeepOmit<TestObj, 'person'>; // {}
type DeepOmitRes2 = DeepOmit<TestObj, 'person.name'>; // { person: { age: { value: number } } }
type DeepOmitRes3 = DeepOmit<TestObj, 'name'>; // TestObj
type DeepOmitRes4 = DeepOmit<TestObj, 'person.age.value'>; // { person: { name: string; age: {} } }

应用场景

如下所示,鼠标悬浮到对应的类型变量可以查看类型。