我有一个用例,需要提取TypeScript interface
中嵌套字段的所有可能路径。
当我在具有嵌套和可选属性的“main”类型中定义一个属性时,它会按预期工作。但是,我遇到了一个指向另一个接口的可选属性的问题。
type NestedKeyOf<T extends object> = {
[Key in keyof T & (string | number)]: T[Key] extends object
? `${Key}` | `${Key}.${NestedKeyOf<T[Key]>}`
: `${Key}`;
}[keyof T & (string | number)];
interface MyParameters {
Foo: string;
Bar?: string;
}
interface MyObject {
Parameters?: MyParameters;
Foo: {
Bar?: string;
}
}
// Here, I'd expect "Parameters.Foo" and "Parameters.Bar" to also exist
// Instead, all I get is "Parameters" | "Foo" | "Foo.Bar"
type Path = NestedKeyOf<MyObject> // "Parameters" | "Foo" | "Foo.Bar"
- TypeScriptPlayground
有没有人能解释一下这种行为的原因?谢谢!
1条答案
按热度按时间scyqe7ek1#
问题是如果Parameters是可选的,
type Test = MyObject["Parameters"] extends object ? true : false
的计算结果为false
。您可以通过排除使用Exclude<T[Key], undefined> extends object
而不是T[Key] extends object
(playground)未定义它的情况来解决此问题: