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


257

Кто-нибудь знает разницу между строкой и строкой в ​​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
Я думаю, «это ошибка» - действительно хороший философский вопрос. Это, вероятно, "предназначено", но это создает путаницу и ошибки компиляции. Я думаю, что это по крайней мере проблема.
Герман

Ответы:


252

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

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

Stringэто тип JavaScript String, который вы можете использовать для создания новых строк. Никто не делает этого, так как в 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 (?)). Разве не следует одинаково относиться к присваиваниям между строкой, строкой и наоборот?
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» против новой строки («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' является объектом-оболочкой. Предпочитаю использовать «строку», когда это возможно.

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


1

TypeScript: Stringпротивstring

Аргумент типа 'String' не может быть назначен параметру типа 'string'.

'string' является примитивом, но 'String' является объектом-оболочкой.

Предпочитаю использовать «строку», когда это возможно.

демонстрация

String Object

// 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.