TypeScript strängliteral metod-överlagring för händelser


Vissa typsdefinitionsfiler jag har använt har deklarerat vissa metodöverlagringar med strängliteral. Så i en ambient d.ts-fil har jag sett:

on(event: string, listener: Function): this;
on(event: 'endTag', listener: (name: string, location?: LocationInfo) => void): this;

och detta resulterar i trevlig IntelliSense i VSCode som listar varje händelse och de olika funktionsöverskrivningar du behöver använda för var och en av dem.

Tyvärr får du i vanlig TypeScript inte använda strängliteral som ovan. Du kan definiera en sträng som en typ...

export type Open = "open";
export type Close = "close";
export type Error = "error";

...men du kan inte deklarera metodöverladdningar som endast skiljer sig åt genom dessa strängtyper. dvs. du får inte göra detta för närvarande:

on(event:Open, cb:()=>void){}
on(event:Close, cb:()=>void){}
on(event:Error, cb:(e:string)=>void){}

Finns det ett sätt att definiera en metod så att den visar IntelliSense med de olika händelsenamnen och parameteröverlagringarna som motsvarar dessa händelser?

Svar #1

Det korrekta sättet att implementera detta är att använda metodsignaturoverloading; du kan dock endast ha en metodimplementering:

export class Client {
  on(event: "open", cb: () => void)
  on(event: "close", cb: () => void)
  on(event: "error", cb: (err: Error) => void)
  on(event: string, cb: Function) {
    switch (event) {
      /*add handlers*/
    }
  }
}

Relaterade artiklar