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 // 非翻译属性正常保留 };
原理说明
- 第一个映射类型:遍历原类型的所有键,匹配
${基础名称}${语言后缀}格式的键,将其替换为基础名称,仅保留对应语言的属性值类型。 - 第二个映射类型:遍历原类型的所有键,排除带指定语言后缀的键,直接保留剩余非翻译属性的键和类型。
- 通过交叉类型
&将两部分合并,得到同时包含转换后翻译属性和原非翻译属性的最终类型。
内容的提问来源于stack exchange,提问作者sandrooco
相关产品推荐
相关产品推荐

