TypeScript: Hur skulle jag skriva typerna för en anropbar/förlängningsbar enhet?


Jag har en JavaScript-funktion/klass som både kan anropas och utökas. Låt oss säga att den heter Hello.

Hello kan användas på två sätt:

class Hi extends Hello { }

eller

Hello('there');

Hur skulle jag skriva typningarna för Hello så att TypeScript vet att det både är anropbart och utökningsbart?

Svar #1

Sättet att göra det på är att deklarera Hello som en variabel som har en typ som är ett gränssnitt med både anropbara och konstruktorsignaturer:

// this is the type for an object that new Hello() creates
declare interface Hello  { 
    foo(a: string): void;
}

// this is the type for Hello variable
declare interface HelloType {
    (text: string): void;
    new (...args: any[]): Hello;
}

declare var Hello: HelloType;

// can be used as a class
class Hi extends Hello { 
    bar(b: string): void {
        this.foo(b);
    }
}

// and as a function
Hello('there');

Relaterade artiklar