Returtypssäkerhet för överlagrade funktioner, TypeScript
Koden nedan skulle misslyckas. TypeScript skulle (felaktigt) tro att returtypen är string och tillåta dig att anropa charAt-metoden på den, när det faktiskt är ett number.
Finns det ett sätt att förbättra koden så att TypeScript upptäcker buggen?
function fn(s: number): number
function fn(n: string): string
function fn(arg: any): any { return 0 }
fn("hi").charAt(0)
Svar #1
Om du säger till Typescript att något är sant, kommer det då att anta att du talar sanning.
Ta helt enkelt bort function fn(n: string): string för att upptäcka den buggen. Definiera bara det som faktiskt är sant.
Ignorera testfallet, basfallet för metodöverlagring är inte korrekt definierat. Enligt https://www.typescriptlang.org/docs/handbook/functions.html#overloads bör basfallet deklareras som function fn(arg):any. Observera att parametern saknar en typ.
Detta skulle fortfarande inte se den angivna koden som ett fel eftersom överlagringen fn(n:string):string härleds från den givna parametern.