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

TypeScript深度移除本地化键并注入其子类型(支持数组)

深度移除本地化键并注入对应Record类型的TypeScript实现

要实现深度移除对象和数组中所有localizations键,并将该键对应的多语言Record结构合并到原位置的类型工具,可以用以下TypeScript类型实现:

// 核心类型工具:处理对象和数组的深度扁平化
type FlattenLocalizations<T> = 
  // 处理数组:递归处理每个元素
  T extends Array<infer U> 
    ? Array<FlattenLocalizations<U>>
    : // 处理对象
    T extends object
      ? // 先移除localizations键,递归处理剩余属性
        {
          [K in keyof T as Exclude<K, 'localizations'>]: FlattenLocalizations<T[K]>
        } & 
        // 提取localizations中的多语言结构(假设所有语言结构一致)
        (T extends { localizations: infer L } 
          ? L extends Record<string, infer V> 
            ? V 
            : never
          : never)
      : // 基础类型直接返回
        T;

// 辅助类型:展开交叉类型,让结果更易读
type Prettify<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;

逻辑说明

  1. 数组处理:如果输入是数组,就对数组的每一项递归应用FlattenLocalizations,保证嵌套数组也能被正确处理。
  2. 对象处理:
    • 第一步遍历对象所有键,排除localizations,对剩余属性值递归处理;
    • 第二步检查对象是否包含localizations键,若包含则提取其对应的多语言Record结构,取任意语言的结构(示例中所有语言结构一致)并与第一步的结果合并。
  3. 基础类型:对于字符串、数字等非对象/数组类型,直接返回原类型。
  4. Prettify辅助:将合并后的交叉类型展开,让最终类型的显示更直观整洁。

示例验证

给定输入类型:

type Given = {
  foo: string;
  bar: number;
  localizations: {
    de: {
      name: string;
      email: string;
    };
    en: {
      name: string;
      email: string;
    }
  }
  deep: Array<{
    foo: string;
    localizations: {
      de: {
        bar: string;
      };
      en: {
        bar: string;
      }
    }
  }>
};

使用类型工具:

type Desired = Prettify<FlattenLocalizations<Given>>;

最终得到的类型与期望完全一致:

type Desired = {
  foo: string;
  bar: number;
  name: string;
  email: string;
  deep: Array<{
    foo: string;
    bar: string;
  }>
};

额外说明

如果localizations中不同语言的结构不一致,该类型会自动合并所有语言的属性(取交叉类型)。若需要强制所有语言结构完全一致,可以在类型中添加额外的一致性校验逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:01:04