2013-02-06 7 views
97

Kennt jemand den Unterschied zwischen Zeichenfolge und Zeichenfolge in TypeScript? Habe ich recht, wenn ich annehme, dass sie gleich sein sollten?Typescript: Unterschied zwischen Zeichenfolge und Zeichenfolge

var a: String = "test"; 
var b: string = "another test"; 
a = b; 
b = a; // this gives a compiler error! 

Aktuelle Version des Compilers sagt:

Type 'String' is not assignable to type 'string'. 
    'string' is a primitive, but 'String' is a wrapper object. 
    Prefer using 'string' when possible. 

dass ein Fehler ist?

Antwort

91

Hier ist ein Beispiel, das die Unterschiede zeigt, die bei der Erklärung helfen werden.

var s1 = new String("Avoid newing things where possible"); 
var s2 = "A string, in TypeScript of type 'string'"; 
var s3: string; 

String ist der Typ JavaScript String, die Sie könnte Gebrauch neue Saiten zu erstellen. Niemand tut dies, da in JavaScript die Literale als besser angesehen werden. Daher erstellt s2 im obigen Beispiel eine neue Zeichenfolge ohne die Verwendung des Schlüsselworts new und ohne das Objekt String explizit zu verwenden.

string ist der TypeScript-Stringtyp, mit dem Sie Variablen, Parameter und Rückgabewerte eingeben können.

Zusätzliche Hinweise ...

Aktuell (Februar 2013) Sowohl s1 und s2 gelten JavaScript. s3 ist gültiges TypeScript.

Verwendung von String. Sie müssen es wahrscheinlich nie verwenden, String-Literale werden allgemein als die richtige Methode zur Initialisierung eines Strings akzeptiert. In JavaScript ist es auch zu Objektliterale und Array-Literale zu verwenden als besser:

var arr = []; // not var arr = new Array(); 
var obj = {}; // not var obj = new Object(); 

Wenn Sie wirklich eine Vorliebe für die Saite haben, konnte man es in Typoskript in einem von zwei Arten verwenden ...

+0

Danke, um das zu klären. Daher ist es sicher, die Primitiv-Zeichenkette zu verwenden, um mögliche Typkonvertierungsprobleme zu vermeiden, wenn andere Bibliotheken verwendet werden, die mit Zeichenkettenwerten arbeiten (basierend auf der Idee, dass niemand tatsächlich Zeichenkette (?) Verwendet). Sollten die Zuweisungen zwischen String und String und umgekehrt nicht gleich behandelt werden? – Paul0515

+1

Es ist eigentlich sicher zu verwenden, da die TypeScript-Typen entfernt werden, um Ihnen 100% kompatibles JavaScript zu geben (in den Versionen ES3 oder ES5 und in der Version 1 ES6). Ich würde empfehlen, den Typ 'string' und eine literale Initialisierung zu verwenden:' var s: string = "My String"; '. – Fenton

+0

für die Aufzeichnung, dank Typinferenz, 'var s: string =" Meine Zeichenfolge "' ist identisch mit 'var s =" Meine Zeichenfolge "' ... auch, egal wie oft ich diese Antwort lese, ich Ich verstehe immer noch nicht den Zweck des 'string' -Typs in TypeScript, da am Ende des Tages' ('My String') ['constructor'] === String' ... –

17

Die beiden Typen unterscheiden sich sowohl in JavaScript als auch in TypeScript - TypeScript gibt uns einfach die Syntax zum Kommentieren und Überprüfen von Typen.

String bezieht sich auf eine Objektinstanz, die in ihrer Prototypkette String.prototype hat. Sie können eine solche Instanz auf verschiedene Arten erhalten, z. new String('foo') und Object('foo'). Sie können für eine Instanz des Typs String mit dem Operator instanceof, z. myString instanceof String.

string ist einer der primitiven Typen von JavaScript, und string Werte werden in erster Linie mit Literalen z. und "bar", und als Ergebnis Art von verschiedenen Funktionen und Operatoren. Sie können den Typ string mit typeof myString === 'string' testen.

Die überwiegende Mehrheit der Zeit, string ist der Typ, den Sie verwenden sollten - fast alle API-Schnittstellen, die Zeichenfolgen übernehmen oder zurückgeben, werden es verwenden. Alle JS-Grundtypen werden mit ihren entsprechenden Objekttypen umschlossen (boxed), wenn sie als Objekte verwendet werden, z. Zugriff auf Eigenschaften oder auf Aufruf von Methoden.Da String derzeit als Schnittstelle und nicht als Klasse in TypeScript's core library deklariert ist, bedeutet strukturelles Schreiben, dass string als Untertyp von String betrachtet wird. Aus diesem Grund besteht Ihre erste Zeile die Kompilierungsprüfungen.

Verwandte Themen