在 TypeScript 中,我试图正确键入“从基类继承的类数组”类型的变量。
使用此代码,我收到错误“”无法创建抽象类的实例。 ts(2511) ’我明白。但我不想实例化 Base 的成员,只是它的后代。
abstract class Base {
abstract execute(param: string): void;
protected name: string;
constructor(name: string) {
this.name = name;
}
public commonMethod() {
console.log("Common Method");
}
}
class A extends Base {
execute() {
console.log(`Hello from A, ${this.name}`);
this.commonMethod();
}
}
class B extends Base {
execute() {
console.log(`Hello from B, no-name`);
}
}
const list: typeof Base[] = [A, B];
const names = ["Phil", "Andy", "Bob"];
names.map((name) => list.map((cl) => new cl(name)));
我将如何正确输入 const list: ???[] = [A, B];
当我切换到 const list: typeof A[] = [A,B]
它有效,但随后建议所有列表条目都是 A
他们不是。Playground link
最佳答案
您可以使用构造函数签名而不是类本身:
const list: Array<new (name: string) => Base> = [A, B];
const names = ["Phil", "Andy", "Bob"];
names.map((name) => list.map((cl) => new cl(name)));
Playground Link这不会让你访问静态,如果你需要那些你也可以使用:
const list: Array<Omit<typeof Base, never> & (new (name: string) => Base)> = [A, B];
const names = ["Phil", "Andy", "Bob"];
names.map((name) => list.map((cl) => new cl(name)));
list[0].foo();
Playground Link
关于typescript - 键入从同一基类继承的类列表的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66314681/