抽象类的具体子类的Typescript类型

时间:2016-06-03 15:42:32

标签: typescript typescript1.8

我正在尝试在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中指定它?

1 个答案:

答案 0 :(得分:4)

您的数组类型应为:

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

然后这个:

myFooClasses.push(foo);

产生此错误:

  

类型foo&#39;类型的论证不能分配给类型的参数   &#39; {new():foo}&#39;。无法为a分配抽象构造函数类型   非抽象构造函数类型。

你也可以这样做:

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