You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:48:16