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

如何通过递归实现带const断言的TypeScript类型扁平化?

扁平化嵌套Item类型以支持getItemValue处理嵌套key

问题背景

现有TypeScript代码中,getItemValue函数仅能处理顶层Item的key,无法识别嵌套在items数组中的key(如示例中的3),需要扁平化MyItem类型,使其包含所有层级的key与对应value的类型映射。

解决方案

通过递归泛型类型提取所有层级的Item结构,生成扁平化的类型集合:

type Item = {
    key: number;
    value: string;
    items?: readonly Item[];
}

const items = [
    { key: 1, value: 'foo', items: [{ key: 3, value: 'baz' }] },
    { key: 2, value: 'bar' }
] as const;

// 递归扁平化所有层级的Item类型
type FlattenItems<T> = T extends { 
    key: infer K, 
    value: infer V, 
    items?: readonly infer I[] 
} 
  ? { key: K, value: V } | FlattenItems<I> 
  : never;

// 生成包含所有层级的扁平化Item类型
type MyItem = FlattenItems<typeof items[number]>;

function getItemValue<K extends MyItem['key']>(key: K): Extract<MyItem, { key: K }>['value'];
function getItemValue(key: MyItem['key']) {
    return ''; // 实现细节无关紧要
}

const x = getItemValue(1);
//    ^? const x: "foo"

const y = getItemValue(2);
//    ^? const y: "bar"

const z = getItemValue(3);
//    ^? const z: "baz"

类型说明

  • FlattenItems<T>:递归遍历传入的类型T,提取当前层级的key和value,同时递归处理items数组中的嵌套Item,最终返回所有层级Item类型的联合类型。
  • MyItem:基于FlattenItems生成包含顶层和所有嵌套Item的扁平化类型集合。
  • 修改后的getItemValue:泛型约束K扩展自MyItem['key'],确保仅允许传入合法key;返回类型通过Extract精准匹配对应key的value类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:18