如何在TypeScript中强制两个嵌套翻译对象拥有相同键结构?
实现翻译对象的自动结构约束
当然可以实现无需手动维护的类型约束,核心是利用TypeScript的typeof操作符提取已有翻译对象的结构,再配合递归工具类型统一约束叶子节点类型。
具体实现步骤:
- 定义递归工具类型
这个类型会递归遍历目标对象的所有嵌套结构,确保所有叶子节点都是string类型,同时完全保留原对象的键结构:
type TranslationStructure<T> = { [K in keyof T]: T[K] extends object ? TranslationStructure<T[K]> : string; };
- 约束新翻译对象的类型
直接用typeof en提取已有翻译对象的结构,通过上面的工具类型处理后,作为新对象的类型注解:
// 已有英文翻译对象 const en = { MAIN_MENU: { TITLE: 'Welcome', SUBTITLE: 'Select an option' }, SETTINGS: { LANGUAGE: 'Language' } as const; // 可选:添加as const让结构推断更严谨 // 约束西班牙语翻译对象的结构与en完全一致 const es: TranslationStructure<typeof en> = { MAIN_MENU: { TITLE: 'Bienvenido', SUBTITLE: 'Selecciona una opción' }, SETTINGS: { LANGUAGE: 'Idioma' } };
效果说明:
- 当
en的结构发生修改(比如新增/删除嵌套键),es的类型约束会自动同步更新,完全不需要手动修改接口。 - TypeScript会严格检查
es的键是否与en完全匹配,同时确保所有翻译值都是字符串类型,避免结构不匹配或类型错误。
内容的提问来源于stack exchange,提问作者Gabriel Furstenheim
相关产品推荐
相关产品推荐

