TypeScript:指定变量是抽象类的后代

时间:2019-05-07 13:33:50

标签: typescript

假设

abstract class A {
  protected abstract f(): void;
}

class B extends A {
  public f() { return 'B'; }
}

class C extends A {
  public f() { return 'C'; }
}

,我想要一个包含BC的数组。可以通过以下方式完成:

let arr: Array<B | C> = [/* lots of objects */];
arr.forEach(item => item.f());

在这里,我想使Array<B | C>更灵活,更通用,以使其成为Array</*descendent of A*/>

有人可以给我个建议吗?

1 个答案:

答案 0 :(得分:3)

您可以仅使用A作为数组项。如果您计划从类外部对派生类型进行调用,则f应该是公开的,对要保护的抽象成员没有任何限制:

abstract class A {
    public abstract f(): string;
}

class B extends A {
    public f() { return 'B'; }
}

class C extends A {
    public f() { return 'C'; }
}

let arr: Array<A> = [/* lots of objects */];
arr.forEach(item => item.f());