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

TypeScript实现保留非翻译属性的多语言对象转换类型

解决方案

要让类型同时保留转换后的翻译属性和非翻译属性,你需要调整映射类型,分两种情况处理:匹配语言后缀的属性(转换为基础名称)、不匹配的属性(直接保留)。下面是修改后的实现:

通用工具类型实现

// 接受原类型T和语言后缀Lang(比如'De'/'Fr')
type TranslatedObject<T, Lang extends string> = {
  // 处理带指定语言后缀的属性,将键转换为基础名称(如nameDe → name)
  [K in keyof T as K extends `${infer Name}${Lang}` ? Name : never]: T[K];
} & {
  // 保留所有不带指定语言后缀的属性(如price)
  [K in keyof T as K extends `${string}${Lang}` ? never : K]: T[K];
};

使用示例

interface Car {
  nameDe: string,
  nameFr: string,
  price: number
}

// 生成德语版本的Car类型
type CarDe = TranslatedObject<Car, 'De'>;

const carWithUserLang: CarDe = {
  name: 'Make Model Trim', // 对应原nameDe的类型
  price: 50000 // 非翻译属性正常保留
};

原理说明

  1. 第一个映射类型:遍历原类型的所有键,匹配${基础名称}${语言后缀}格式的键,将其替换为基础名称,仅保留对应语言的属性值类型。
  2. 第二个映射类型:遍历原类型的所有键,排除带指定语言后缀的键,直接保留剩余非翻译属性的键和类型。
  3. 通过交叉类型&将两部分合并,得到同时包含转换后翻译属性和原非翻译属性的最终类型。

内容的提问来源于stack exchange,提问作者sandrooco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:34