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

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"

原代码问题说明

之前的实现有三个核心问题:

  1. 没有收集遍历过程中符合要求的键,只递归处理了值,最终返回的是值类型而非键的联合
  2. 直接对所有键的联合做类型判断,没有逐个键校验对应的值是否为NestedNav类型
  3. 没有处理根节点名称的收集逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:04