我有3个界面:

export interface Foo {a:string}
export interface Foo2 extends Foo {b:boolean}
export interface Foo3 extends Foo {c:number}


如何进行没有错误的班级分配?

class Goo {
  fooVar: Foo | Foo2 | Foo3;

  constructor() {
    this.fooVar.c = 0; <------ ERROR!
  }
}


欢迎所有帮助:)

最佳答案

有多个选项(如果fooVar确实应该是FooFoo2Foo3之一)。

最简单的解决方案是类型断言:

  class Goo {
    fooVar: Foo | Foo2 | Foo3 = {
      a: ""
    };

    constructor() {
      (this.fooVar as Foo3).c = 0
    }
  }


如果c中已经存在fooVar,并且您仅想对其进行分配(即fooVar已经是Foo3),则可以使用in类型防护:

  class Goo {
    fooVar: Foo | Foo2 | Foo3 = {
      a: "", c: -1
    };

    constructor() {
      if('c' in this.fooVar) this.fooVar.c = 0
    }
  }


如果您不介意更改对象引用,则可以使用spread:

  class Goo {
    fooVar: Foo | Foo2 | Foo3 = {
      a: "",
    };

    constructor() {
      this.fooVar = {...this.fooVar, c: 0 }
    }
  }

10-05 20:34