2016-08-03 3 views
1

Ich habe die folgende einfache Funktion, die jede Art von Argumente und sollte eine Reihe zurück:Sollte der Rückgabewert von TypeScript Garantie-Funktionen?

function foo(x:any): number { 
    return x.bar; 
} 

var b = {bar: "shit happens"}; 
console.log(foo(b)); // foo returns 'shit happens' which is not a number. 

Es scheint, dass, wenn x.bar keine Zahl enthält dann diese Rückgabewert der Funktion kann alles sein.

Meine Frage ist: Gibt es eine Möglichkeit zu garantieren, dass der Rückgabewert der Funktion wird immer eine Zahl und nichts anderes (wie in anderen stark typisierten Sprachen)? Wenn nicht, was ist der Vorteil der Verwendung von TypeScript, wenn das Typisierungssystem nur einen "Hinweis" auf die vorzuziehenden Rückgabetypen gibt, die verwendet werden sollen und falsche Rückgabetypen zulässt.

Antwort

4

Das Problem hier ist Ihre Verwendung des Typs any.
Im Grunde sagen Sie dem Compiler "Schau, ich weiß, was ich mache, überprüfe die Dinge nicht für mich".
Sie sollten vermeiden, any zu verwenden, denn dann umgehen Sie die Compiler-Prüfungen, und wenn Sie das tun werden, warum nicht einfach Javascript verwenden?

Wenn Sie nicht any verwenden, sondern eine Art oder Schnittstelle dann erhalten Sie eine Fehlermeldung erhalten:

type FooParam = { 
    bar: number; 
} 

function foo(x: FooParam): number { 
    return x.bar; 
} 

var b = { bar: "shit happens" }; 
console.log(foo(b)); 

(code in playground)

Sie werden einen Fehler in der letzten Zeile erhalten:

Argument of type { bar: string; } is not assignable to parameter of type { bar: number; }

Sie vermeiden können diese FooParam Typ mit:

function foo(x: { bar: number }): number { ... }