2012-12-19 10 views
10

Ich habe einige Komponententests in TypeScript geschrieben. Das Beispiel QUnit Test enthält:Double Equals (==) in TypeScript

ok(1 == "1", "Passed!"); 

Der tsc Compiler behauptet, dass:

Operator '==' kann nicht auf Typen 'Zahl' und 'String'

und Ausfahrten angewendet werden mit Status 1 (obwohl es die JS korrekt produziert).

Die Spezifikation sagt:!

Die <,>, < =,> =, ==, = === und == Operatoren

Diese Operatoren ein Operandtyp erfordern identisch oder ein Subtyp des anderen Operandentyps sein. Das Ergebnis ist immer vom booleschen primitiven Typ.

So sieht es aus wie die Warnung/der Fehler ist richtig. Bezwingt das nicht den Punkt des Typs, der den Operator == erzwingt? Gibt es jemals einen gültigen Anwendungsfall für die Verwendung von == in TypeScript, die nicht diese Warnung erzeugen?

Antwort

11

Mindestens ein wahrscheinliches Szenario für == (dh mit Typumwandlung) in Typoskript ist, wenn einer der erwarteten Operanden von jeder Art ist:

Ein Typ S ist ein Subtyp eines Typs T und T ist ein Supertyp von S, wenn einer der folgenden Werte zutrifft: [...]

T ist der Any-Typ.

Jetzt sehen Sie wahrscheinlich das Bild: jede Funktion, die ein Jeder param kann sicher hat (na ja, mehr-o-weniger, alle häufig vorkommenden Problemfälle von == sind hier noch angewendet) vergleichen es mit dem Wert jedes Satzes Geben Sie == ein.

3

Einer der Punkte von TypeScript bedeutet, dass wir klareres JavaScript schreiben. Tun Sie etwas wie 1 == "1" und es wird nicht funktionieren, es sei denn Sie explizit es werfen oder ToString()/ParseInt() verwenden, abhängig davon, ob Sie Zeichenfolgen oder Zahlen vergleichen möchten.

Sie können Any verwenden, damit sich Variablen wie gewöhnliche dynamische JavaScript-Variablen verhalten, aber dann verlieren Sie den Punkt von TS aus den Augen, der von einem starken Tipp-/Typschlussfolgerungssystem profitieren soll, das uns hilft, nicht mit den Vielen in Konflikt zu geraten JavaScript-Fehler, die aufgrund der automatischen Typzwangsregeln existieren.

6

Hier sind einige gemeinsame Typoskript Beispiele, die durch den Compiler erlaubt sind und die Verwendung von == zu machen.

var a: string = "A"; 
var b: Object = "A"; 

if (a == b) { 
    alert("Example 1"); 
} 

var c: any = "1"; 
var d: number = 1; 

if (c == d) { 
    alert("Example 2"); 
} 

var e: any = "E"; 
var f: string = "E"; 

if (e == f) { 
    alert("Example 3"); 
}