Typoskript: Unterschied zwischen String und String


256

Kennt jemand den Unterschied zwischen String und String in TypeScript? Habe ich Recht, wenn ich annehme, dass sie gleich sein sollten?

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

Die 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.

Ist das ein Fehler?


1
Ich denke, "ist das ein Fehler" ist wirklich eine gute philosophische Frage. Es ist wahrscheinlich "beabsichtigt", aber es schafft Verwirrung und Kompilierungsfehler. Ich denke, das ist zumindest ein Problem.
Gherman

Antworten:


252

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

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

Stringist der JavaScript - String - Typ, die Sie könnten neue Saiten erstellen verwenden. Niemand tut dies, da in JavaScript die Literale als besser angesehen werden. s2Im obigen Beispiel wird daher eine neue Zeichenfolge ohne Verwendung des newSchlüsselworts und ohne explizite Verwendung des StringObjekts erstellt.

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

Zusätzliche Bemerkungen...

Derzeit (Feb 2013) Beide s1und s2sind gültiges JavaScript. s3ist gültiges TypeScript.

Verwendung von String. Sie müssen es wahrscheinlich nie verwenden. Zeichenfolgenliterale werden allgemein als die richtige Methode zum Initialisieren einer Zeichenfolge akzeptiert. In JavaScript wird es auch als besser angesehen, Objektliterale und Array-Literale zu verwenden:

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

Wenn Sie wirklich eine Vorliebe für den String hatten, können Sie ihn in TypeScript auf zwei Arten verwenden ...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type

Vielen Dank, dass Sie das geklärt haben. Es ist daher sicher, die Zeichenfolge primitve type zu verwenden, um mögliche Probleme bei der Typkonvertierung zu vermeiden, wenn andere Bibliotheken verwendet werden, die mit Zeichenfolgenwerten arbeiten (basierend auf der Idee, dass niemand tatsächlich String (?) Verwendet). Sollten Zuweisungen zwischen String und String und umgekehrt nicht gleich behandelt werden?
Paul0515

1
Es ist tatsächlich sicher, beide zu verwenden, da die TypeScript-Typen entfernt wurden, um Ihnen 100% kompatibles JavaScript zu bieten (entweder in ES3- oder ES5-Varianten und in Version 1 ES6-Version). Ich würde empfehlen, den stringTyp und eine wörtliche Initialisierung zu verwenden : var s: string = "My String";.
Fenton

Denn der Datensatz ist dank der Typinferenz var s: string = "My String"identisch mit var s = "My String"... auch, egal wie oft ich diese Antwort lese, ich verstehe den Zweck des stringTyps in TypeScript immer noch nicht , da am Ende des Tages , ('My String')['constructor'] === String...
mindplay.dk

2
Normalerweise würden Sie die Annotation hinzufügen, wenn Sie die Variable nicht mit einem Wert initialisieren würden.
Fenton

2
Ich habe eine Antwort hinzugefügt, um zu verdeutlichen, dass "foo" gegen new String ("foo") keine neue Unterscheidung ist, die von TypeScript eingeführt wurde. Ich denke nicht, dass es hilfreich ist, einen JS-Typ und einen TS-Typ zu nennen.
Joe Lee-Moyet

60

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

Stringbezieht sich auf eine Objektinstanz String.prototypein ihrer Prototypenkette. Sie können eine solche Instanz auf verschiedene Arten erhalten, z . B. new String('foo')und Object('foo'). Sie können Stringmit dem instanceofOperator eine Instanz des Typs testen , z myString instanceof String.

stringist einer der primitiven Typen von JavaScript, und stringWerte werden hauptsächlich mit Literalen erstellt, z. B. 'foo'und "bar", und als Ergebnistyp verschiedener Funktionen und Operatoren. Sie können den stringTyp mit testen typeof myString === 'string'.

Die überwiegende Mehrheit der Zeit stringist der Typ, den Sie verwenden sollten - fast alle API-Schnittstellen, die Zeichenfolgen annehmen oder zurückgeben, verwenden ihn. Alle JS Urtyp wird eingewickelt (wird eingerahmt mit den entsprechenden Objekttypen) , wenn sie als Objekte, zB den Zugriff auf Eigenschaften oder das Aufrufen von Methoden. Da die strukturelle Typisierung Stringderzeit als Schnittstelle und nicht als Klasse in der Kernbibliothek von TypeScript deklariert ist, stringwird sie als Subtyp betrachtet String, weshalb Ihre erste Zeile die Prüfung des Kompilierungstyps besteht.


2

In JavaScript können Zeichenfolgen entweder primitive Zeichenfolgen oder Zeichenfolgenobjekte sein. Der folgende Code zeigt die Unterscheidung:

var a: string = 'test'; // string literal
var b: String = new String('another test'); // string wrapper object

console.log(typeof a); // string
console.log(typeof b); // object

Ihr Fehler:

Der Typ 'String' kann nicht dem Typ 'String' zugewiesen werden. 'string' ist ein Grundelement, aber 'String' ist ein Wrapper-Objekt. Verwenden Sie nach Möglichkeit lieber 'string'.

Wird vom TS-Compiler ausgelöst, weil Sie versucht haben, den Typ stringeinem Zeichenfolgenobjekttyp zuzuweisen (erstellt über das newSchlüsselwort). Der Compiler teilt Ihnen mit, dass Sie den Typ stringnur für primitive Zeichenfolgentypen verwenden sollten und diesen Typ nicht zur Beschreibung von Zeichenfolgenobjekttypen verwenden können.


1

TypeScript: Stringvs.string

Das Argument vom Typ 'String' kann nicht dem Parameter vom Typ 'String' zugewiesen werden.

'string' ist ein Grundelement, aber 'String' ist ein Wrapper-Objekt.

Verwenden Sie nach Möglichkeit lieber 'string'.

Demo

String-Objekt

// error
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: String = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: String = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

String primitiv

// ok
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: string = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: string = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

Geben Sie hier die Bildbeschreibung ein


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.