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

TypeScript提取可选嵌套字段路径异常问题咨询

为什么TypeScript类型工具NestedKeyOf无法处理指向interface的可选属性?

问题原因

你的NestedKeyOf类型工具无法生成Parameters.Foo和Parameters.Bar的核心原因是可选属性的类型包含undefined:

  • 当属性标记为可选(如Parameters?: MyParameters),TypeScript会将其类型推断为MyParameters | undefined
  • 原类型中的判断逻辑T[Key] extends object会直接失败,因为undefined并不属于object类型范畴,因此不会触发递归生成嵌套路径,仅返回属性名"Parameters"

对比Foo属性:它的类型是{ Bar?: string }(本身非可选,只是内部属性可选),所以T[Key] extends object判断成立,能正常递归生成Foo.Bar路径。

解决方案

我们需要先剔除可选属性中的undefined类型,再判断是否为object。可以使用TypeScript内置的NonNullable<T>工具类型来实现这一点:

type NestedKeyOf<T extends object> = {
  [Key in keyof T & (string | number)]: 
    // 先排除undefined和null,再判断目标类型是否为object
    NonNullable<T[Key]> extends object
      ? `${Key}` | `${Key}.${NestedKeyOf<NonNullable<T[Key]>>}`
      : `${Key}`;
}[keyof T & (string | number)];

interface MyParameters {
  Foo: string;
  Bar?: string;
}

interface MyObject {
  Parameters?: MyParameters;
  Foo: {
    Bar?: string;
  }
}

// 现在结果符合预期:"Parameters" | "Parameters.Foo" | "Parameters.Bar" | "Foo" | "Foo.Bar"
type Path = NestedKeyOf<MyObject>

修正逻辑说明

  • NonNullable<T[Key]>会移除类型中的undefined和null,对于Parameters?: MyParameters来说,就得到了纯粹的MyParameters类型
  • 此时NonNullable<T[Key]> extends object判断成立,会递归调用NestedKeyOf<MyParameters>生成Foo和Bar路径,最终组合成Parameters.Foo、Parameters.Bar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:32