如何在TypeScript联合类型中修改指定属性名称并自动同步?
TypeScript类型转换:替换联合类型指定属性并自动同步新增字段
原始类型定义
type BaseUser = { id: string __type: "User" } type UserA = Omit<BaseUser, '__type'> & { name: string __type: "UserA" } type UserB = Omit<BaseUser, '__type'> & { ageB: number __type: "UserB" } type UserC = Omit<BaseUser, '__type'> & { name: string ageC: number __type: "UserC" } type User = UserA | UserB | UserC type Request = { info: { id: string users: Array<User> } }
需求说明
需要生成一个与Request结构完全一致的新类型,满足以下要求:
- 将联合类型
User中指定子类型的特定属性替换为统一属性:比如把UserB的ageB、UserC的ageC替换为age: number - 当
UserB/UserC等子类型新增其他属性时,新类型能自动同步这些新增字段,无需手动修改 - 支持自定义配置属性映射规则,比如可以指定
UserB的years、UserC的grade都转换为age
解决方案
步骤1:定义属性映射规则
先创建一个类型,明确每个User子类型对应的属性替换规则:
// 属性映射规则:key是User子类型的__type值,value是「原属性名 -> 目标属性名」的映射 type UserPropertyMap = { UserB: { ageB: "age" }, UserC: { ageC: "age" } // 可扩展:比如要把UserB的years也转成age,就改成 { ageB: "age", years: "age" } }
步骤2:创建单个User子类型的转换工具
// 提取所有User子类型的__type值 type UserType = User['__type'] // 转换单个User子类型的工具类型 type TransformUser<T extends User> = // 移除当前子类型中需要替换的属性 Omit<T, keyof UserPropertyMap[T['__type']]> & // 添加目标属性,类型继承原属性的类型 { [K in UserPropertyMap[T['__type']][keyof UserPropertyMap[T['__type']]]]: T[keyof UserPropertyMap[T['__type']]] } & // 保留原类型的__type标识字段 { __type: T['__type'] }
步骤3:生成转换后的Request类型
// 生成转换后的User联合类型 type TransformedUser = TransformUser<User> // 生成与原Request结构一致的新类型,自动同步原始结构的变化 type TransformedRequest = Omit<Request, 'info'> & { info: Omit<Request['info'], 'users'> & { users: Array<TransformedUser> } }
验证结果
通过TypeScript类型推断,TransformedRequest的最终结构如下:
{ info: { id: string users: Array<{ id: string name: string __type: "UserA" } | { id: string age: number __type: "UserB" } | { id: string name: string age: number __type: "UserC" }> } }
当UserB新增属性(比如gender: string)时,TransformedUser会自动同步该字段:
// 修改后的UserB类型 type UserB = Omit<BaseUser, '__type'> & { ageB: number gender: string // 新增属性 __type: "UserB" } // 此时TransformedUser中的UserB子类型自动变为: { id: string age: number gender: string __type: "UserB" }
内容的提问来源于stack exchange,提问作者FieryRider
相关产品推荐
相关产品推荐

