gpt4 book ai didi

typescript - 键入从同一基类继承的类列表的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 02:27:41 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com