Dattiloscritto: differenza tra stringa e stringa


257

Qualcuno conosce la differenza tra String e string in TypeScript? Sono corretto nel ritenere che dovrebbero essere uguali?

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

La versione corrente del compilatore dice:

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

È un bug?


1
Penso che "is that a bug" sia davvero una buona domanda filosofica. Probabilmente è "destinato" a esserlo, ma crea confusione ed errori di compilazione. Penso che sia almeno un problema.
Gherman,

Risposte:


252

Ecco un esempio che mostra le differenze, che aiuterà con la spiegazione.

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

Stringè il tipo di stringa JavaScript, che è possibile utilizzare per creare nuove stringhe. Nessuno lo fa come in JavaScript i valori letterali sono considerati migliori, quindi s2nell'esempio sopra crea una nuova stringa senza l'uso della newparola chiave e senza usare esplicitamente l' Stringoggetto.

string è il tipo di stringa TypeScript, che è possibile utilizzare per digitare variabili, parametri e valori restituiti.

Note aggiuntive...

Attualmente (febbraio 2013) Entrambi s1e s2sono JavaScript valido. s3è TypeScript valido.

Uso di String. Probabilmente non dovrai mai usarlo, i letterali di stringa sono universalmente accettati come il modo corretto di inizializzare una stringa. In JavaScript, è anche meglio usare letterali di oggetti e letterali di array:

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

Se avessi davvero un debole per la stringa, potresti usarlo in TypeScript in due modi ...

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

Grazie per averlo chiarito. Quindi è sicuro usare la stringa di tipo primitve per evitare possibili problemi di conversione del tipo quando si usano altre librerie che funzionano con i valori di stringa (in base all'idea che nessuno effettivamente utilizza String (?)). Tuttavia, le assegnazioni tra stringa e stringa e viceversa non dovrebbero essere trattate allo stesso modo?
Paul0515

1
In realtà è sicuro da usare sia poiché i tipi TypeScript sono eliminati per darti JavaScript compatibile al 100% (in versioni ES3 o ES5 e nella versione 1 ES6). Ti consiglio di utilizzare il stringtipo e un'inizializzazione letterale: var s: string = "My String";.
Fenton,

per la cronaca, grazie all'inferenza del tipo, var s: string = "My String"è identico a var s = "My String"... inoltre, non importa quante volte leggo questa risposta, non riesco ancora a capire lo scopo del stringtipo in TypeScript, dato che, alla fine della giornata , ('My String')['constructor'] === String...
mindplay.dk

2
Normalmente aggiungerei l'annotazione se non inizializzi la variabile con un valore.
Fenton,

2
Ho aggiunto una risposta per chiarire che "pippo" vs nuova stringa ("pippo") non è una nuova distinzione introdotta da TypeScript - non credo sia utile chiamarne uno un tipo JS e l'altro un tipo TS.
Joe Lee-Moyet,

60

I due tipi sono distinti in JavaScript e in TypeScript: TypeScript ci fornisce semplicemente la sintassi per annotare e controllare i tipi mentre procediamo.

Stringsi riferisce a un'istanza di oggetto che ha String.prototypenella sua catena di prototipi. È possibile ottenere un caso del genere in vari modi, ad esempio new String('foo')e Object('foo'). È possibile verificare un'istanza del Stringtipo con l' instanceofoperatore, ad es myString instanceof String.

stringè uno dei tipi primitivi di JavaScript e i stringvalori vengono creati principalmente con valori letterali, ad esempio 'foo'e "bar", e come tipo di risultato di varie funzioni e operatori. Puoi testare il stringtipo usando typeof myString === 'string'.

La maggior parte delle volte stringè il tipo che dovresti usare - quasi tutte le interfacce API che accettano o restituiscono stringhe lo useranno. Tutti i tipi di primitive JS verranno racchiusi (in scatola ) con i corrispondenti tipi di oggetti quando li si utilizza come oggetti, ad es. Accesso a proprietà o metodi di chiamata. Poiché Stringattualmente è dichiarata come un'interfaccia piuttosto che una classe nella libreria principale di TypeScript , la tipizzazione strutturale significa che stringè considerato un sottotipo del Stringmotivo per cui la tua prima riga supera i controlli del tipo di compilazione.


2

In JavaScript le stringhe possono essere di tipo primitivo o oggetti stringa. Il seguente codice mostra la distinzione:

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

Il tuo errore:

Digitare 'String' non è assegnabile per digitare 'string'. 'string' è una primitiva, ma 'String' è un oggetto wrapper. Preferisci usare 'string' quando possibile.

Viene generato dal compilatore TS perché si è tentato di assegnare il tipo stringa un tipo di oggetto stringa (creato tramite newparola chiave). Il compilatore ti sta dicendo che dovresti usare il tipo stringsolo per i tipi primitivi di stringhe e non puoi usare questo tipo per descrivere i tipi di oggetti stringa.


1

TypeScript: Stringvsstring

L'argomento di tipo 'String' non è assegnabile al parametro di tipo 'string'.

'string' è una primitiva, ma 'String' è un oggetto wrapper.

Preferisci usare 'string' quando possibile.

dimostrazione

Oggetto String

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

primitivo per archi

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

inserisci qui la descrizione dell'immagine


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.