[在某些情况下,我想“合并”那些默认类型联接(即T | U
或T & U
)无法实现我想要的类型。
我想做的是深度和智能类型合并,它将在合并过程中自动将属性标记为可选,并执行TypeScript接口/类型的深度合并。
举个例子,假设我们有类型A
和B
。
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> = ?????;
然后,如果在类型A
和B
上使用,输出将如下所示
type AB = {
a: string;
b: number | boolean;
c?: boolean;
d: {
a2: string;
b2?: number;
c2?: boolean;
};
e?: number;
};
如所示,Merge
类型将执行以下逻辑:
T
和U
上并且是相同的类型,则将其标记为必填项,并设置为T
/ U
中的类型(如属性a
发生的情况) 。T
和U
上,但类型不同,则将其标记为必需,如果它是原始类型(例如,与属性b
一起发生的情况),则将其设置为联合类型,或进行递归如果它是一个对象,则合并(如属性d
发生的情况)。c
和b2
发生的情况和c2
)。e
发生的事情]假定您可以使用递归条件类型,尽管我知道它们是aren't yet officially supported,不应在生产中使用。我可以为生产用例制作类似于jcalz @的解决方案here的展开版本。
Here is a playground设置要测试的问题。
TLDR: