Typescript: At videregive et arvet klassenavn som et argument til en funktion


Jeg har følgende kode (forenklet):

class Component {

}

class CameraComponent extends Component {
    foo: number;

    constructor(bar: number) {
        super()
    }
}

function doSomething(klass: typeof Component) {

}

doSomething(CameraComponent);

Dette giver mig følgende fejl:

TS2345: Argument of type 'typeof CameraComponent' is not assignable to parameter of type 'typeof Component'.

Hvis jeg ændrer CameraComponent til dette, fungerer det fint:

class CameraComponent extends Component {
    foo: number;

    constructor() {
        super()
    }
}

Er der noget, jeg overser? Hvorfor kan jeg ikke ændre konstruktørsignaturen? Er der en måde, jeg kan få dette til at fungere uden at ty til any?

Svar #1

Kodet i typeof Component er ikke kun det faktum, at klass er en konstruktor, der skal returnere en Component, men også parametrene for den konstruktor. Så hvis du sender en CameraComponent ind, der kræver et andet antal parametre, vil du få en fejl

Hvis du vil acceptere enhver konstruktør, der returnerer en Component, kan du bruge new (...a: any[]) => Component

class Component {

}

class CameraComponent extends Component {
    foo: number;

    constructor(bar: number) {
        super()
    }
}

function doSomething(klass: new (...a: any[]) => Component) {

}

doSomething(CameraComponent);

Relaterede artikler