Машинопись: разница между строкой и строкой

85

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

Это ошибка?

Теги:

2 ответа

88
Лучший ответ

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

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
  • 0
    Спасибо за очистку этого. Поэтому безопасно использовать строку типа primitve, чтобы избежать возможных проблем с преобразованием типов при использовании других библиотек, работающих со строковыми значениями (основываясь на идее, что никто на самом деле не использует String (?)). Разве не следует одинаково относиться к присваиваниям между строкой, строкой и наоборот?
  • 1
    На самом деле его безопасно использовать, так как типы TypeScript удалены, чтобы дать вам 100% совместимый JavaScript (в версиях ES3 или ES5 и в версии 1 ES6). Я бы порекомендовал использовать string тип и буквальную инициализацию: var s: string = "My String"; ,
Показать ещё 5 комментариев
16

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню