递归类型不适用于具有未知字段的嵌套对象

时间:2019-03-10 02:33:10

标签: typescript

我正在尝试为具有未知字段的嵌套对象创建递归类型(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)

有人知道为什么这行不通以及如何解决吗?

1 个答案:

答案 0 :(得分:2)

foo.b的类型为number | Foo。此处的打字稿可防止您尝试访问d上的字段number(或任何字段)。

您需要断言foo.b实际上是Foo而不是number或更改对象的类型。

如果您确定它是Foo,那么const bar = (foo.b as Foo).d应该可以解决问题。否则将其移至if语句中,同时使用typeof检查缩小类型以确保其!= number