TypeScript:如何让条件类型推断与模板字面量支持嵌套对象
解决嵌套多语言属性的类型转换问题
当前的TranslatedObject类型仅能处理顶层属性的多语言后缀移除,嵌套对象(如数组中的Gimmick实例)未被递归转换,导致类型不兼容错误。
要实现嵌套场景的类型转换,需要让TranslatedObject支持递归处理数组和嵌套对象:
type TranslatedObject<T> = // 处理数组:递归转换数组元素类型 T extends Array<infer U> ? Array<TranslatedObject<U>> : // 处理对象:递归转换每个属性的类型 T extends object ? { [K in keyof T as K extends `${infer Name}${'De' | 'Fr'}` ? Name : K]: TranslatedObject<T[K]>; } : // 基础类型直接保留原类型 T; interface Gimmick { nameDe: string; nameFr: string; } interface Car { nameDe: string; nameFr: string; price: number; gimmicks: Gimmick[]; } const tcar: TranslatedObject<Car> = { name: 'Car name', price: 69, gimmicks: [{ name: 'seat ventilation' }], // 类型匹配,无错误 };
关键逻辑说明
- 针对数组类型:提取数组元素类型
U,将数组转换为TranslatedObject<U>[],实现数组内元素的递归转换 - 针对对象类型:在处理属性名的同时,对每个属性值递归应用
TranslatedObject,覆盖嵌套对象的转换需求 - 基础类型(如
string、number)直接返回原类型,避免不必要的转换
内容的提问来源于stack exchange,提问作者sandrooco
相关产品推荐
相关产品推荐

