TypeScript如何递归提取NestedNav嵌套类型的所有键组成联合类型
正确实现代码
首先定义工具类型判断目标是否为NestedNav类型,再实现递归遍历收集键的逻辑:
// 提取NestedNav包裹的实际导航类型,非NestedNav类型返回never type IsNestedNav<T> = T extends NestedNav<infer U> ? U : never; // 泛型参数说明: // T: 当前遍历的导航类型 // RootKey: 根节点的名称,因TS无法自动读取类型标识符,需要手动传入一次 type NestedKeys<T extends Nav, RootKey extends string | never = never> = // 加入根节点名称 RootKey // 遍历当前类型所有键,筛选符合要求的键并递归处理子节点 | { [K in keyof T]: T[K] extends IsNestedNav<T[K]> ? K | NestedKeys<IsNestedNav<T[K]>> : never }[keyof T]
调用验证
和预期输出完全匹配:
type Result = NestedKeys<RootNav, "RootNav"> // 推导结果:"RootNav" | "LoginNav" | "RegistrationNav" | "AppNav" | "MainNav"
原代码问题说明
之前的实现有三个核心问题:
- 没有收集遍历过程中符合要求的键,只递归处理了值,最终返回的是值类型而非键的联合
- 直接对所有键的联合做类型判断,没有逐个键校验对应的值是否为
NestedNav类型 - 没有处理根节点名称的收集逻辑
内容的提问来源于stack exchange,提问作者uloco
相关产品推荐
相关产品推荐

