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;
逻辑说明
- 数组处理:如果输入是数组,就对数组的每一项递归应用
FlattenLocalizations,保证嵌套数组也能被正确处理。 - 对象处理:
- 第一步遍历对象所有键,排除
localizations,对剩余属性值递归处理; - 第二步检查对象是否包含
localizations键,若包含则提取其对应的多语言Record结构,取任意语言的结构(示例中所有语言结构一致)并与第一步的结果合并。
- 第一步遍历对象所有键,排除
- 基础类型:对于字符串、数字等非对象/数组类型,直接返回原类型。
- 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
相关产品推荐
相关产品推荐

