Texto datilografado: diferença entre String e string

257

Alguém sabe a diferença entre String e string no TypeScript? Estou correto ao assumir que eles devem ser os mesmos?

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

A versão atual do compilador diz:

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

Isso é um bug?

Paul0515
fonte
1
Eu acho que "é que um bug" é realmente uma boa pergunta filosófica. Provavelmente é "pretendido" ser assim, mas cria confusão e erros de compilação. Eu acho que é pelo menos um problema.
Gherman

Respostas:

252

Aqui está um exemplo que mostra as diferenças, o que ajudará na explicação.

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

Stringé o tipo de String JavaScript, que você pode usar para criar novas strings. Ninguém faz isso como no JavaScript, os literais são considerados melhores; portanto, s2no exemplo acima, cria uma nova string sem o uso da newpalavra - chave e sem o uso explícito do Stringobjeto.

string é o tipo de string TypeScript, que você pode usar para digitar variáveis, parâmetros e valores de retorno.

Notas Adicionais...

Atualmente (fevereiro de 2013) Ambos s1e s2são JavaScript válido. s3é TypeScript válido.

Uso de String. Você provavelmente nunca precisará usá-lo, literais de string são universalmente aceitos como sendo a maneira correta de inicializar uma string. Em JavaScript, também é considerado melhor usar literais de objeto e literais de matriz também:

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

Se você realmente tinha uma propensão para a string, poderia usá-la no TypeScript de uma de duas maneiras ...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type
Fenton
fonte
Thanx por esclarecer isso. Portanto, é seguro usar a string do tipo primitve para evitar possíveis problemas de conversão de tipo ao usar outras bibliotecas que funcionam com valores de string (com base na idéia de que ninguém realmente usa String (?)). As atribuições entre string e String e vice-versa não devem ser tratadas igualmente?
Paul0515
1
Na verdade, é seguro usá-lo, pois os tipos TypeScript são removidos para fornecer JavaScript 100% compatível (nos sabores ES3 ou ES5 e no sabor ES6 da versão 1). Eu recomendaria usar o stringtipo e uma inicialização literal: var s: string = "My String";.
Fenton
para o registro, graças à inferência de tipo, var s: string = "My String"é idêntico a var s = "My String"... também, não importa quantas vezes eu leia essa resposta, ainda não entendo o objetivo do stringtipo no TypeScript, pois, no final do dia , ('My String')['constructor'] === String...
mindplay.dk
2
Você normalmente adicionaria a anotação se não estivesse inicializando a variável com um valor.
Fenton
2
Eu adicionei uma resposta para esclarecer que "foo" vs new String ("foo") não é uma nova distinção introduzida pelo TypeScript - não acho útil chamar um tipo JS e o outro TS.
precisa saber é o seguinte
60

Os dois tipos são distintos em JavaScript, assim como o TypeScript - o TypeScript apenas nos fornece sintaxe para anotar e verificar os tipos à medida que avançamos.

Stringrefere-se a uma instância de objeto que possui String.prototypeem sua cadeia de protótipos. Você pode obter essa instância de várias maneiras, por exemplo, new String('foo')e Object('foo'). Você pode testar uma instância do Stringtipo com o instanceofoperador, por exemplo myString instanceof String.

stringé um dos tipos de primitivas JavaScript, e stringos valores são criados principalmente com literais por exemplo, 'foo'e "bar", e como o tipo de resultado de várias funções e operadores. Você pode testar o stringtipo usando typeof myString === 'string'.

A grande maioria das vezes, stringé o tipo que você deve usar - quase todas as interfaces de API que usam ou retornam seqüências de caracteres o usarão. Todos os tipos primitivos de JS serão agrupados (em caixa ) com seus tipos de objetos correspondentes ao usá-los como objetos, por exemplo, acessar propriedades ou chamar métodos. Como Stringatualmente é declarado como uma interface e não como uma classe na biblioteca principal do TypeScript , a tipagem estrutural significa que stringé considerado um subtipo, pelo Stringque sua primeira linha passa nas verificações de tipo de compilação.

Joe Lee-Moyet
fonte
2

No JavaScript, as strings podem ser do tipo primitivo ou de objetos da string. O código a seguir mostra a distinção:

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

Seu erro:

O tipo 'String' não pode ser atribuído ao tipo 'string'. 'string' é uma primitiva, mas 'String' é um objeto de wrapper. Prefira usar 'string' quando possível.

É lançada pelo compilador TS porque você tentou atribuir o tipo stringa um tipo de objeto de string (criado por newpalavra - chave). O compilador está lhe dizendo que você deve usar o tipo stringapenas para tipos primitivos de strings e não pode usá-lo para descrever os tipos de objetos de strings.

Willem van der Veen
fonte
1

TypeScript: Stringvsstring

O argumento do tipo 'String' não é atribuível ao parâmetro do tipo 'string'.

'string' é uma primitiva, mas 'String' é um objeto de wrapper.

Prefira usar 'string' quando possível.

demonstração

Objeto 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 de string

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

insira a descrição da imagem aqui

xgqfrms
fonte