Typescript: разница между строкой и строкой

Кто-нибудь знает разницу между строкой и строкой в ​​ 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

Вот пример, который показывает различия, которые помогут в объяснении.

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

Ответ 2

Два типа различаются в 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, поэтому ваша первая строка передает проверки типа компиляции.

Ответ 3

В 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' является объектом-оболочкой. Предпочитаю использовать "строку", когда это возможно.

Вызывается компилятором TS, потому что вы пытались присвоить string типа для типа объекта строки (созданного с помощью new ключевого слова). Компилятор говорит вам, что вы должны использовать string типа только для строковых примитивных типов, и вы не можете использовать этот тип для описания типов строковых объектов.