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
相关产品推荐
相关产品推荐

