typescript - Typescript - 深度类型合并,包括可选属性
问题描述
到目前为止,我一直在使用交集 ( &
) 运算符来合并两种对象类型。在某些情况下,交叉点不会:
- 两个对象中都存在对象类型的属性,我想合并它们
- 两个对象中都存在一个可选属性。
- object 类型的可选属性存在于两个对象中。
我正在寻找一种也可以处理这些情况的通用产品。
这个答案显示了如何隔离可选属性。
解决方案
首先感谢您提供类似问题的链接,我从那里获取了实用程序类型 - OptionalPropertyOf
。下面是你的问题的解决方案
type OptionalPropertyOf<T> = Exclude<{
[K in keyof T]: T extends Record<K, T[K]>
? never
: K
}[keyof T], undefined>
type Merge<T1, T2,
First = {
[K in (keyof T1)]: K extends keyof T2 ? T1[K] | T2[K] : T1[K]
}, OptionalSecond = {
[K in Exclude<OptionalPropertyOf<T2>, keyof T1>]+?: T2[K]
},
NonOptionalSecond = {
[K in Exclude<keyof T2, keyof First | keyof OptionalSecond>]: T2[K]
}> = First & OptionalSecond & NonOptionalSecond
// Example
type A = {
a: string,
b?: number,
f: number,
}
type B = {
a: boolean,
b? : string,
c?: string,
e: number
}
type C = Merge<A, B>
/* type C evaluated as
{
a: string | boolean;
b?: string | number | undefined;
f: number;
c?: string | undefined;
e: number;
}
*/
const value: C = {
a: true,
e: 1,
f: 2
}
我们做了三个步骤:
- type
First
表示T1
+ 的所有字段 ifT2
有相同的字段我们通过 union 合并 - type
OptionalSecond
表示可选T2
但未在 type 中使用的字段First
。我们在这里说+?
是为了说明这些字段在这里仍然是可选的 - type
NonOptionalSecond
表示其中的每个字段T2
是附加的和非可选的
结果我们拥有两种类型的所有可选字段,在重复合并的情况下也是由联合完成的。
推荐阅读
- javascript - 为什么我的 handleChange 没有被调用?MaterialUI
- android - 无法从意图中保存图片
- .net - 在实体框架中使用 AsQueryable 编写带有枚举值的 WHERE 条件
- node.js - 数据库重置后,Sequelize 错误枚举已存在
- optimization - Julia 优化达到最大迭代次数
- kdb - kdb:值和评估之间的差异
- pandas - Pandas 根据值替换多列的值
- java - 返回流中具有不同映射的Hashmap
- firebase - Firebase 数据安全
- python - 在 VS Code 中安装 mypy 的问题