如何通过递归实现带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
相关产品推荐
相关产品推荐

