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

TypeScript:指定变量是抽象类的后代,typescript,Typescript,假设 我想要一个包含B和C的数组。可通过以下方式完成: abstract class A { protected abstract f(): void; } class B extends A { public f() { return 'B'; } } class C extends A { public f() { return 'C'; } } 让arr:Array=[/*很多对象*/]; arr.forEach(item=>item.f()); 在这里,我想使Arra

假设

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

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

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

class C extends A {
  public f() { return 'C'; }
}
让arr:Array=[/*很多对象*/];
arr.forEach(item=>item.f());
在这里,我想使
Array
更加灵活和通用,这样它将是
Array


有人能给我一个建议吗?

你可以用
A
作为数组项
f
应该是公共的如果您计划在类外部的派生类型上调用它,则对要保护的抽象成员没有限制:

let arr: Array<B | C> = [/* lots of objects */];
arr.forEach(item => item.f());
抽象类A{
公共摘要f():字符串;
}
B类扩展了A类{
公共f(){return'B';}
}
C类扩展了{
公共f(){return'C';}
}
让arr:Array=[/*很多对象*/];
arr.forEach(item=>item.f());

为什么不
让arr:Array
A
是抽象的,不能创建
A
的实例,因此数组中的所有实例都将是
A
@TitianCernicova Dragomir的子类型。如果这样做,问题是:
item.f()
会引发编译错误,属性f是受保护的,并且只能在类A及其子类中访问。如果
f
在所有派生类上都是公共的,为什么在
A
中声明为
protected
?将它公开,一切都会按预期工作。你能不能不使用一个接口而不是抽象的
interface MyInterface{f:()=>void;}
并在任何扩展类上实现它,然后你可以使用
let arr:MyInterface[]
?@TitianCernicova Dragomir-Uhm,因为
Base
是一个抽象类。我不确定是否有一种解决方法——在抽象类中定义一个空的
public f()
并在子类中覆盖它。在抽象类中声明一个返回类型
void
,但在子类中声明
string
,感觉不太正确。这似乎违反了Liskovs SP.@DavidBarker我刚才复制粘贴的,你当然是对的
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());