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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:33:10