Mecanografiado: diferencia entre String y string

257

¿Alguien sabe la diferencia entre String y string en TypeScript? ¿Estoy en lo cierto al suponer que deberían ser lo mismo?

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

La versión actual del compilador dice:

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

¿Eso es un error?

Paul0515
fuente
1
Creo que "es un error" es realmente una buena pregunta filosófica. Probablemente sea "intencionado", pero crea confusión y errores de compilación. Creo que al menos es un problema.
Gherman

Respuestas:

252

Aquí hay un ejemplo que muestra las diferencias, lo que ayudará con la explicación.

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

Stringes el tipo de cadena de JavaScript, que puede usar para crear nuevas cadenas. Nadie hace esto ya que en JavaScript los literales se consideran mejores, por lo que s2en el ejemplo anterior crea una nueva cadena sin el uso de la newpalabra clave y sin usar explícitamente el Stringobjeto.

string es el tipo de cadena TypeScript, que puede usar para escribir variables, parámetros y valores de retorno.

Notas adicionales...

Actualmente (febrero de 2013) Ambos s1y s2son JavaScript válido. s3es válido TypeScript.

Usar de String. Probablemente nunca necesite usarlo, los literales de cadena se aceptan universalmente como la forma correcta de inicializar una cadena. En JavaScript, también se considera mejor usar literales de objeto y literales de matriz también:

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

Si realmente tenía una inclinación por la cadena, podría usarla en TypeScript de una de dos maneras ...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type
Fenton
fuente
Gracias por aclarar eso. Por lo tanto, es seguro usar la cadena de tipo primitve para evitar posibles problemas de conversión de tipo cuando se usan otras bibliotecas que funcionan con valores de cadena (en base a la idea de que nadie realmente usa String (?)). Sin embargo, ¿no deberían tratarse las asignaciones entre string y String y viceversa?
Paul0515
1
En realidad, es seguro de usar, ya que los tipos TypeScript se eliminan para brindarle JavaScript 100% compatible (en sabores ES3 o ES5, y en la versión 1 sabor ES6). Yo recomiendo usar el stringtipo y la inicialización literal: var s: string = "My String";.
Fenton
para el registro, gracias a la inferencia de tipos, var s: string = "My String"es idéntico a var s = "My String"... además, no importa cuántas veces lea esto responda, todavía no entiendo el propósito del stringtipo en TypeScript, ya que, al final del día , ('My String')['constructor'] === String...
mindplay.dk
2
Normalmente agregaría la anotación si no inicializara la variable con un valor.
Fenton
2
Agregué una respuesta para aclarar que "foo" vs new String ("foo") no es una nueva distinción introducida por TypeScript. No creo que sea útil llamar a uno un tipo JS y al otro un tipo TS.
Joe Lee-Moyet
60

Los dos tipos son distintos tanto en JavaScript como en TypeScript: TypeScript simplemente nos da la sintaxis para anotar y verificar los tipos a medida que avanzamos.

Stringse refiere a una instancia de objeto que tiene String.prototypeen su cadena de prototipo. Puede obtener dicha instancia de varias maneras, por ejemplo, new String('foo')y Object('foo'). Puede probar una instancia del Stringtipo con el instanceofoperador, por ejemplo myString instanceof String.

stringes uno de los tipos primitivos de JavaScript, y stringlos valores se crean principalmente con literales por ejemplo, 'foo'y "bar", y, como el tipo de resultado de diversas funciones y operadores. Puede probar el stringtipo usando typeof myString === 'string'.

La gran mayoría de las veces, stringes el tipo que debería usar: casi todas las interfaces API que toman o devuelven cadenas lo usarán. Todos los tipos primitivos JS se envolverán ( encuadrarán ) con sus tipos de objeto correspondientes cuando se usen como objetos, por ejemplo, accediendo a propiedades o llamando a métodos. Dado Stringque actualmente se declara como una interfaz en lugar de una clase en la biblioteca principal de TypeScript , la tipificación estructural significa que stringse considera un subtipo, Stringrazón por la cual su primera línea pasa las comprobaciones de tipo de compilación.

Joe Lee-Moyet
fuente
2

En JavaScript, las cadenas pueden ser tipo cadena primitiva u objetos de cadena. El siguiente código muestra la distinción:

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

Su error:

El tipo 'Cadena' no es asignable para escribir 'cadena'. 'string' es un primitivo, pero 'String' es un objeto contenedor. Prefiere usar 'string' cuando sea posible.

El compilador de TS lo arroja porque intentó asignar el tipo stringa un tipo de objeto de cadena (creado mediante una newpalabra clave). El compilador le dice que debe usar el tipo stringsolo para tipos primitivos de cadenas y no puede usar este tipo para describir tipos de objetos de cadena.

Willem van der Veen
fuente
1

TypeScript: Stringvsstring

El argumento del tipo 'Cadena' no se puede asignar al parámetro del tipo 'cadena'.

'string' es un primitivo, pero 'String' es un objeto contenedor.

Prefiere usar 'string' cuando sea posible.

manifestación

Objeto de cadena

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

cadena primitiva

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

ingrese la descripción de la imagen aquí

xgqfrms
fuente