501 Stimmen

Was ist der Unterschied zwischen den Typen String und string?

Kennt jemand den Unterschied zwischen String und string in TypeScript? Ist es richtig anzunehmen, dass sie gleich sein sollten?

var a: String = "test";
var b: string = "another test";
a = b;
b = a; // das gibt einen Kompilierungsfehler!

Die aktuelle Version des Compilers sagt:

Typ 'String' ist nicht zuweisbar zu Typ 'string'.
  'string' ist ein primitiver Typ, aber 'String' ist ein Wrapper-Objekt.
     Bevorzugen Sie 'string', wenn möglich.

Ist das ein Fehler?

434voto

Fenton Punkte 221749

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

var s1 = new String("Vermeiden Sie das Erstellen neuer Dinge, wo immer möglich");
var s2 = "Ein String, in TypeScript vom Typ 'string'";
var s3: string;

String ist der JavaScript-String-Typ, den Sie könnten verwenden, um neue Strings zu erstellen. Niemand tut dies, da in JavaScript die Literale als besser angesehen werden. Daher erstellt s2 im obigen Beispiel einen neuen String ohne Verwendung des new-Schlüsselworts und ohne explizite Verwendung des String-Objekts.

string ist der TypeScript-String-Typ, den Sie für die Typisierung von Variablen, Parametern und Rückgabewerten verwenden können.

Zusätzliche Anmerkungen...

Aktuell (Feb 2013) sind sowohl s1 als auch s2 gültiges JavaScript. s3 ist gültiges TypeScript.

Verwendung von String. Sie müssen es wahrscheinlich nie verwenden, String-Literale werden universell als korrekter Weg angesehen, einen String zu initialisieren. In JavaScript wird auch empfohlen, Objektliterale und Array-Literale zu verwenden:

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

Wenn Sie wirklich eine Vorliebe für den String hätten, könnten Sie ihn in TypeScript auf eine von zwei Arten verwenden...

var str: String = new String("Hallo Welt"); // Verwendet das JavaScript String-Objekt
var str: string = String("Hallo Welt"); // Verwendet den TypeScript-String-Typ

86voto

Joe Lee-Moyet Punkte 1655

Die beiden Typen unterscheiden sich sowohl in JavaScript als auch in TypeScript - TypeScript gibt uns einfach nur Syntax, um Typen zu kennzeichnen und während des Prozesses zu überprüfen.

String bezieht sich auf eine Objektinstanz, die String.prototype in ihrer Prototypenkette hat. Eine solche Instanz kann auf verschiedene Arten erstellt werden, z.B. new String('foo') und Object('foo'). Sie können auf eine Instanz des Typs String mithilfe des instanceof-Operators testen, z.B. myString instanceof String.

string ist einer der primitiven Typen von JavaScript, und string-Werte werden hauptsächlich mit Literalen erstellt, z.B. 'foo' und "bar", sowie als Ergebnistyp verschiedener Funktionen und Operatoren. Sie können den Typ string mithilfe von typeof myString === 'string' überprüfen.

Die überwiegende Mehrheit der Zeit sollte string der Typ sein, den Sie verwenden sollten - fast alle API-Schnittstellen, die Zeichenfolgen übergeben oder zurückgeben, werden ihn verwenden. Alle JS-primitiven Typen werden (geboxed) mit ihren entsprechenden Objekttypen umhüllt, wenn sie als Objekte verwendet werden, z.B. Zugriff auf Eigenschaften oder Aufrufen von Methoden. Da String derzeit als Interface und nicht als Klasse in TypScripts Kernbibliothek deklariert ist, bedeutet strukturelle Typisierung, dass string als Subtyp von String betrachtet wird, weshalb Ihre erste Zeile die Überprüfungstypchecks besteht.

37voto

Javier Aviles Punkte 7502

Für schnelle Leser:

Verwenden Sie niemals die Typen Number, String, Boolean, Symbol oder Object. Diese Typen beziehen sich auf nicht-primitive Boxobjekte, die in JavaScript-Code fast nie angemessen verwendet werden. (Hervorhebung von mir)

Quelle: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html

16voto

Willem van der Veen Punkte 26043

In JavaScript können Zeichenfolgen entweder vom Typ string-primitiv oder von Typ String-Objekt sein. Der folgende Code zeigt den Unterschied:

var a: string = 'test'; // Zeichenfolge literal
var b: String = new String('another test'); // Zeichenfolgen Wrapper-Objekt

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 primitiver Typ, aber 'String' ist ein Wrapper-Objekt. Verwenden Sie wann möglich den Typ 'string'.

Der TypeScript-Compiler wirft diese Fehlermeldung, weil Sie versucht haben, den Typ string einem String-Objekttyp (erstellt mit dem new-Schlüsselwort) zuzuweisen. Der Compiler sagt Ihnen, dass Sie den Typ string nur für Zeichenfolgen primitiven Typs verwenden sollten und Sie diesen Typ nicht verwenden können, um Zeichenfolgenobjekttypen zu beschreiben.

6voto

xgqfrms Punkte 7010

TypeScript: String vs string

Argument of type 'String' is not assignable to parameter of type 'string'.

'string' is a primitive, but 'String' is a wrapper object.

Prefer using 'string' when possible.

demo

String Object

// 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 primitive

// 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));
  }
}

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X