TypeScript类型合并

问题描述 投票:2回答:1

[在某些情况下,我想“合并”那些默认类型联接(即T | UT & U)无法实现我想要的类型。

我想做的是深度和智能类型合并,它将在合并过程中自动将属性标记为可选,并执行TypeScript接口/类型的深度合并。

举个例子,假设我们有类型AB

type A = {
  a: string;
  b: number;
  c: boolean;
  d: {
    a2: string;
    b2: number;
  };
  e?: number;
};

type B = {
  a: string;
  b: boolean;
  d: {
    a2: string;
    c2: boolean;
  };
};

我正在寻找一个可以接受2个泛型类型的Merge函数

type Merge<T, U> = ?????;

然后,如果在类型AB上使用,输出将如下所示

type AB = {
  a: string;
  b: number | boolean;
  c?: boolean;
  d: {
    a2: string;
    b2?: number;
    c2?: boolean;
  };
  e?: number;
};

如所示,Merge类型将执行以下逻辑:

  1. [如果属性同时存在于TU上并且是相同的类型,则将其标记为必填项,并设置为T / U中的类型(如属性a发生的情况) 。
  2. [如果属性同时存在于TU上,但类型不同,则将其标记为必需,如果它是原始类型(例如,与属性b一起发生的情况),则将其设置为联合类型,或进行递归如果它是一个对象,则合并(如属性d发生的情况)。
  3. [如果该属性存在于一种类型而不是另一种类型,则将该属性标记为可选,并将其设置为它实际存在的输入类型中的类型(如属性cb2发生的情况和c2)。
  4. [如果属性在一种类型中已经是可选的,则在输出类型上应该是可选的,并应用上述现有规则来确定其值(如属性e发生的事情]

假定您可以使用递归条件类型,尽管我知道它们是aren't yet officially supported,不应在生产中使用。我可以为生产用例制作类似于jcalz @的解决方案here的展开版本。

Here is a playground设置要测试的问题。

typescript types typescript-typings typescript-generics
1个回答
0
投票

TLDR:

© www.soinside.com 2019 - 2024. All rights reserved.