抽象 class 的具体子 classes 的打字稿类型

Typescript type of concrete subclasses of an abstract class

我正在尝试在 Typescript 中解决这个特定案例:

Typescript Playground link

abstract class foo {
    abstract bar();
}

class Foo1 extends foo {
    bar() {
        alert(1);
    }

    y: number = 3;
}

class Foo2 extends foo {
    bar() {
        alert(2);
    }
}

let myFooClasses: Array<typeof foo> = [];
myFooClasses.push(Foo1);
myFooClasses.push(Foo2);

myFooClasses.forEach((item) => {
    let a = new item();
    a.bar();
})

具体来说,问题是 myFooClasses 在技术上可以包含抽象的 foo 并且 Typescript 会对此发出警告。但我真的想将 myFooClasses 的类型限制为继承自 foo 的具体 类。有没有办法在 Typescript 中指定它?

你的数组类型应该是:

let myFooClasses: Array<{ new (): foo }> = [];

然后是这个:

myFooClasses.push(foo);

产生此错误:

Argument of type 'typeof foo' is not assignable to parameter of type '{ new (): foo }'. Can not assign an abstract constructor type to a non-abstract constructor type.

您还可以这样做:

type FooConstructor = { new (): foo };
let myFooClasses: FooConstructor[] = [];