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*/
}
}
}
