Почему TypeScript не показывает ошибку, когда мы присваиваем примитивную строку объекту String?

Насколько я понимаю в TypeScript string это примитив, а String это объект. Рассмотрим следующий код:

let s: string = new String("foo");// ERROR 
let S: String = "foo";//OK

Почему бы нам не получить ошибку на второй строке. Мы показываем, что будем использовать строковый объект, но используем строковый примитив.

Связано: typescriptlang.org/docs/handbook/declaration-files/…

Caramiriel 22.01.2019 15:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
56
1

Ответы 1

Первая строка выдаст ошибку, потому что вы пытаетесь присвоить тип в штучной упаковке примитивному типу, то есть более конкретно.

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

Возвращаясь к первой строке:

let s = new String("foo");
console.info(typeof s); // object

Описание ошибки вполне по делу:

'string' is a primitive, but 'String' is a wrapper object.

Вы все еще можете сделать это, если вы вводите утверждение: TypeScript проходит, а JavaScrip затем распаковывает переменная. Однако я не могу найти причину чего-либо подобного:

let s: string = new String("foo") as string; // OK

Интересно, что вы также можете использовать конверсии с немного похожим синтаксисом:

let s: string = String("foo"); // OK
console.info(typeof s); // string

Это особенно полезно при преобразованиях Boolean, например:

const objectExists = Boolean(someObjectThatMightNotExist);
console.info(typeof objectExists); // boolean

Другие вопросы по теме