Skip to content

Latest commit

 

History

History
53 lines (39 loc) · 1.62 KB

DeepObjectToUniq.md

File metadata and controls

53 lines (39 loc) · 1.62 KB
标题 标签
DeepObjectToUniq(深度对象的唯一性) extends(继承)

深度对象的唯一性。

  • 将对象与 unique 作为属性名,类型应该是符号,属性值为对象与对象属性取并集,如果对象属性还是对象,则递归与 unique 属性,类型符号,属性值为每一层对象组成的数组取并集。

代码如下:

type DeepObjectToUniq<O extends object> = {
  [k in keyof O]: O[k] extends object
    ? DeepObjectToUniq<O[k]> & { [unique: symbol]: [O, k] }
    : O[k];
} & { [unique: symbol]: O };

使用方式:

type Quz = { quz: 4 };

type Foo = { foo: 2; baz: Quz; bar: Quz };
type Bar = { foo: 2; baz: Quz; bar: Quz & { quzz?: 0 } };

type UniqQuz = DeepObjectToUniq<Quz>;
type UniqFoo = DeepObjectToUniq<Foo>;
type UniqBar = DeepObjectToUniq<Bar>;

declare let foo: Foo;
declare let uniqFoo: UniqFoo;

uniqFoo = foo;
foo = uniqFoo;

//  参见util-types/index.d.ts的实现
IsFalse<Equal<UniqQuz, Quz>>;
IsFalse<Equal<UniqFoo, Foo>>;
IsTrue<Equal<UniqFoo['foo'], Foo['foo']>>;
IsTrue<Equal<UniqFoo['bar']['quz'], Foo['bar']['quz']>>;
IsFalse<Equal<UniqQuz, UniqFoo['baz']>>;
IsFalse<Equal<UniqFoo['bar'], UniqFoo['baz']>>;
IsFalse<Equal<UniqBar['baz'], UniqFoo['baz']>>;
IsTrue<Equal<keyof UniqBar['baz'], keyof UniqFoo['baz']>>;
IsTrue<Equal<keyof Foo, keyof UniqFoo & string>>;

应用场景

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