打字稿(2.7+)>参数的多种类型>处理特定属性

时间:2018-05-17 08:48:15

标签: typescript

考虑 ChildClass 扩展 ParentClass 。对于这个问题,Stackblitz可用here

ChildClass 只会添加一个公共属性(“brainPower”):

class ParentClass{

  _me: string;

  constructor() {
    this._me = "I'm a parent";
  }

  whoAmI(): string {
    return this._me;
  }
}

class ChildClass extends ParentClass {

  public readonly brainPower = 42;

  constructor() {
    super();
    this._me = "I'm a child";
  }
}

方法“ doStuff ”采用以下两种参数:

class Program {

  static main() {
    Program.doStuff(new ParentClass());
    Program.doStuff(new ChildClass());
  }

  static doStuff(anInstance: ParentClass | ChildClass){

    console.log('[Program] > Processing > ', anInstance.whoAmI());

    if(anInstance.brainPower){
      console.log('[Processing] > ', anInstance.whoAmI(), ' > I can brain as much as ', anInstance.brainPower);
    }
  }
}

我的问题

Typescript编译器报告:

Property 'brainPower' does not exist on type 'ParentClass | ChildClass'.

问题是如何为参数设置多种可能的类型,并希望打字稿能够理解它,以便只接受其中一种类型已知的属性?

1 个答案:

答案 0 :(得分:2)

您可以将函数的参数设置为接受ParentClass的任何实例。

您可以检查给定对象是ChildClass的实例

,而不是检查属性是否存在。
if (anInstance instanceof ChildClass) ...

ts编译器会将该对象推断为if范围内的ChildClass实例。