В чем разница между типами String и string?
Подскажите, пожалуйста, в чем разница между String
и string
в TypeScript? Правильно ли я понимаю, что они должны быть идентичны?
var a: String = "test";
var b: string = "another test";
a = b;
b = a; // здесь возникает ошибка компиляции!
Текущая версия компилятора сообщает:
Тип 'String' не может быть назначен типу 'string'.
'string' является примитивом, тогда как 'String' - это объект-обертка.
Предпочитайте использовать 'string', когда это возможно.
Это ошибка в компиляторе?
5 ответ(ов)
Вот пример, который демонстрирует различия и поможет в объяснении.
var s1 = new String("Избегайте создавать объекты, если это возможно");
var s2 = "Строка, в TypeScript типа 'string'";
var s3: string;
String
— это тип строки JavaScript, который можно использовать для создания новых строк. Однако на практике это делается довольно редко, поскольку литералы в JavaScript считаются более предпочтительными. Таким образом, s2
в приведённом выше примере создаёт новую строку без использования ключевого слова new
и без явного обращения к объекту String
.
string
— это тип строки в TypeScript, который можно использовать для определения типов переменных, параметров и возвращаемых значений.
Дополнительные примечания...
На данный момент (февраль 2013 года) как s1
, так и s2
являются допустимым JavaScript. s3
— это корректный TypeScript.
Что касается использования String
. Вам, скорее всего, не придётся им пользоваться, строковые литералы универсально принимаются как правильный способ инициализации строк. В JavaScript также считается более правильным использовать литералы объектов и массивов:
var arr = []; // не var arr = new Array();
var obj = {}; // не var obj = new Object();
Если вы действительно хотите использовать String
, то в TypeScript это можно сделать двумя способами:
var str: String = new String("Привет, мир"); // Использует объект String JavaScript
var str: string = String("Привет, мир"); // Использует тип строки TypeScript
TL;DR
Никогда не используйте типы Number
, String
, Boolean
, Symbol
или Object
. Эти типы ссылаются на непервичные обернутые объекты, которые почти никогда не используются корректно в коде JavaScript. (выделение мое)
В JavaScript строки могут быть либо примитивным типом string, либо объектом String. Следующий код демонстрирует это различие:
var a: string = 'test'; // строковый литерал
var b: String = new String('another test'); // объект-обертка строки
console.log(typeof a); // string
console.log(typeof b); // object
Ваше сообщение об ошибке:
Type 'String' is not assignable to type 'string'. 'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.
выдается компилятором TypeScript, поскольку вы попытались присвоить переменной тип string
строковый объект (созданный с помощью ключевого слова new
). Компилятор сообщает вам, что тип string
следует использовать только для примитивных строк, и не следует использовать его для описания типов строковых объектов.
Простой ответ:
string
— это тип. Например,console.log(typeof 'foo') // string
String
— это объект с методами для создания и манипуляции строками.
string
==> примитивный тип данных.String
==> непервичный тип. Это объект, который имеет доступ к методам и свойствам классаString
.
Как динамически назначить свойства объекту в TypeScript?
Как удалить элемент массива в TypeScript?
Перегрузка конструктора в TypeScript
Как подавить ошибку "error TS2533: Object is possibly 'null' or 'undefined'"?
Использование async/await с методом Array.map