Typescript: різниця між рядком та рядком


255

Хтось знає різницю між String і string у TypeScript? Чи правильно я припускаю, що вони повинні бути однаковими?

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

Поточна версія компілятора говорить:

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

Це помилка?


1
Я думаю, "це помилка" - це справді гарне філософське питання. Це, мабуть, "задумано", але це створює плутанину та помилки компіляції. Я думаю, що це принаймні проблема.
— Герман

Відповіді:


251

Ось приклад, який показує відмінності, що допоможе в поясненні.

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

Stringце тип рядка JavaScript, який можна використовувати для створення нових рядків. Ніхто цього не робить, оскільки в JavaScript літерали вважаються кращими, тому s2у наведеному вище прикладі створюється нова рядок без використання newключового слова та без явного використання Stringоб'єкта.

string це тип рядка TypeScript, який можна використовувати для введення змінних, параметрів та повернених значень.

Додаткові нотатки...

На даний момент (лютий 2013 року) s1і те, s2і дійсне JavaScript. s3дійсний TypeScript.

Використання String. Вам, ймовірно, ніколи не потрібно його використовувати, рядкові літерали загальновизнані як правильний спосіб ініціалізації рядка. У JavaScript також вважається кращим використовувати об’єктні літерали та літерали масиву:

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

Якщо у вас дійсно було схильність до рядка, ви можете використовувати його в TypeScript одним із двох способів ...

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

Дякуємо за те, щоб очистити це. Тому безпечно використовувати рядок типу primitve, щоб уникнути можливих проблем з перетворенням типів при використанні інших ліб, які працюють зі значеннями рядків (виходячи з ідеї, що String (?)) Насправді ніхто не використовує. Чи не слід призначити призначення між рядком і String та viceversa однаково?
— Paul0515

1
Насправді безпечно використовувати або те, що типи TypeScript позбавлені, щоб отримати 100% сумісний JavaScript (як у ES3, так і в ES5, а також у версії 1 ES6 аромат). Я б рекомендував використовувати stringтип і буквальне ініціалізацію: var s: string = "My String";.
— Фентон

для запису, завдяки виводу типу, var s: string = "My String"є ідентичним var s = "My String"... також, незалежно від того, скільки разів я читав цю відповідь, я все ще не розумію призначення stringтипу в TypeScript, оскільки в кінці дня , ('My String')['constructor'] === String...
— mindplay.dk

2
Як правило, ви додаєте примітку, якщо ви не ініціалізували змінну зі значенням.
— Фентон

2
Я додав відповідь, щоб уточнити, що "foo" проти нового String ("foo") не є новою відмінністю, введеною TypeScript - я не думаю, що було б корисно називати один тип JS, а другий - тип TS.
— Джо Лі-Моєт

60

Два типи відрізняються в JavaScript, а також TypeScript - TypeScript просто дає нам синтаксис для анотування та перевірки типів, коли ми йдемо далі.

Stringвідноситься до екземпляра об'єкта, який має String.prototypeв своєму прототипі ланцюг. Ви можете отримати такий екземпляр різними способами, наприклад, new String('foo')і Object('foo'). Ви можете перевірити примірник Stringтипу з instanceofоператором, наприклад myString instanceof String.

stringє одним із примітивних типів JavaScript, і stringзначення створюються в основному за допомогою літералів, наприклад, 'foo'та "bar", і як результат результату різних функцій та операторів. Ви можете протестувати на stringтип використання typeof myString === 'string'.

Переважна більшість часу string- це тип, який ви повинні використовувати - майже всі інтерфейси API, які беруть або повертають рядки, будуть використовувати його. Усі примітивні типи JS будуть загорнуті (у коробці ) з відповідними типами об'єктів, коли вони будуть використовувати їх як об'єкти, наприклад, для доступу до властивостей або методів виклику. Оскільки Stringв даний час оголошено як інтерфейс, а не клас в основній бібліотеці TypeScript , структурна типізація означає, що stringвважається підтипом String, тому ваш перший рядок передає перевірки типу компіляції.


2

У рядках JavaScript можуть бути або рядкові примітивні типи, або рядкові об'єкти. Наступний код показує відмінність:

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

Ваша помилка:

Тип "Рядок" не призначається типу "рядок". 'string' - це примітив, але 'String' - це обгортковий об'єкт. Віддайте перевагу використовувати "string", коли це можливо.

Викидається компілятором TS через те, що ви намагалися призначити тип типу stringрядкового об'єкта (створеного за допомогою newключового слова). Компілятор каже вам, що ви повинні використовувати тип stringлише для примітивних типів рядків, і ви не можете використовувати цей тип для опису рядкових типів об'єктів.


1

TypeScript: Stringvsstring

Аргумент типу 'String' не призначається параметру типу 'string'.

'string' - це примітив, але 'String' - це обгортковий об'єкт.

Віддайте перевагу використовувати "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));
  }
}

рядок примітивний

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

введіть тут опис зображення


0

Для швидких читачів:

Чи не коли - або використовувати типи Number, String , , Boolean, символ або об'єкт Цих типів відносяться до непрімітівним штучним об'єктам , які майже ніколи не використовуються належним чином в коді JavaScript.

джерело: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.