如何为TypeScript类型中联合对象的每个成员添加新属性?
给TypeScript联合类型中的每个对象添加额外属性
要实现给A类型里something字段的每个联合对象成员添加newProp属性,可以通过交叉类型结合映射类型完成,下面是具体实现方案:
方案一:通用工具类型(推荐)
这个工具类型可复用在其他需要给指定字段的联合成员加属性的场景:
// 工具类型:给T类型中指定字段K的每个联合成员添加额外属性P type AddPropToUnionField<T, K extends keyof T, P> = { [key in keyof T]: key extends K ? (T[key] & P) : T[key] } // 原类型 type A = { something: {a: 1} | {b: 1} | {c: 1}; somethingElse: 2; } // 生成目标类型 type B = AddPropToUnionField<A, 'something', {newProp: 1}>
生成的B类型结构如下:
type B = { something: {a: 1, newProp: 1} | {b: 1, newProp: 1} | {c: 1, newProp: 1}; somethingElse: 2; }
方案二:针对A的专用工具类型
如果只需要处理A类型,可以直接写专用的类型转换:
type A = { something: {a: 1} | {b: 1} | {c: 1}; somethingElse: 2; } type WithNewProp<T extends A> = { something: T['something'] & {newProp: 1}; somethingElse: T['somethingElse']; } type B = WithNewProp<A>
原理说明
- 交叉类型
&会将两个对象类型合并,当它作用于联合类型时,TypeScript会自动对联合中的每个成员分别执行交叉操作,即(X | Y | Z) & P等价于(X&P) | (Y&P) | (Z&P),正好满足给每个联合对象加属性的需求。 - 映射类型
[key in keyof T]会遍历原类型的所有字段,针对指定字段做修改,其他字段保持原样,让工具类型具备通用性。
内容的提问来源于stack exchange,提问作者MauricioRobayo
相关产品推荐
相关产品推荐

