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.