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

标签 typescript class types

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

相关文章:

派生类的 C# XML 序列化

c - 无法获取字符串的第 n 个字符

types - 什么是 "vocabulary types",存在多少?

R 使用 diff : non-numeric argument to binary operator error

visual-studio-2012 - Web Essentials 在保存 TypeScript 文件时将 .js.map 添加到项目中

typescript - typescript 中的数组减少和可选值

angular - ERROR in Error 遇到静态解析符号值

javascript - 为什么我的 typescript 文件无法使用 gulp typescript 正确生成为 js?

C++ 类 - 如何将自定义类型的 vector 传递给函数

来自继承自 models.Model 的类的 python 子类