我正在尝试为具有未知字段的嵌套对象创建递归类型(Foo
):
interface Foo {
[key: string]: number | Foo;
}
const foo: Foo = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: 3
// etc...
}
}
};
const bar = foo.b.d;
使用上面的代码,我在最后一行收到错误:
Property 'd' does not exist on type 'number | Foo'.
Property 'd' does not exist on type 'number'.ts(2339)
有人知道为什么这行不通以及如何解决吗?
答案 0 :(得分:2)
foo.b
的类型为number | Foo
。此处的打字稿可防止您尝试访问d
上的字段number
(或任何字段)。
您需要断言foo.b
实际上是Foo
而不是number
或更改对象的类型。
如果您确定它是Foo
,那么const bar = (foo.b as Foo).d
应该可以解决问题。否则将其移至if语句中,同时使用typeof
检查缩小类型以确保其!= number
。