typescript1.8 - Typescript-type af konkrete underklasser af en abstrakt klasse


Jeg prøver at løse denne specifikke sag i 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();
})

Specifikt er problemet, at myFooClasses teknisk set kunne indeholde foo, som er abstrakt, og Typescript advarer om dette. Men jeg vil virkelig gerne begrænse typen af myFooClasses til konkrete klasser, der arver fra foo. Er der nogen måde at specificere dette på i Typescript?

Svar #1

Din array-type skal være:

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

og derefter dette:

myFooClasses.push(foo);

giver denne fejl:

Argument af typen 'typeof foo' kan ikke tildeles til parameter af typen '{ new(): foo }'. Kan ikke tildele en abstrakt konstruktørtype til en ikke-abstrakt konstruktørtype.

Du kan også gøre:

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

Relaterede artikler