ПрограммированиеBackend разработчик / TypeScript архитектор

Как реализуются и для чего используются типы-обёртки (Wrapper types) в TypeScript? Какие проблемы возникают при работе с примитивами и их обёртками?

Проходите собеседования с ИИ помощником Hintsage

Ответ

TypeScript различает примитивные типы (string, number, boolean) и их объектные обёртки (String, Number, Boolean). Обёртки — это объекты, созданные через конструкторы:

const primitive: string = 'hello'; const wrapper: String = new String('hello');
  • Примитивы — простые, эффективные, не имеют методов и свойств кроме встроенных.
  • Obj-обёртки — объекты с соответствующими методами/свойствами, редко применимы в бизнес-логике.
  • При сравнении primitive === wrapper — результат false:
console.log('hello' === new String('hello')); // false
  • При типизации старайтесь всегда использовать примитивы (string, а не String).
  • Обёртки применимы только при необходимости работы с generic-API библиотек (например, для рефлексии или метапрограммирования).

Вопрос с подвохом

Можно ли использовать типы-обёртки (String, Number, Boolean) в интерфейсах TypeScript, если значения — примитивы?

Ответ: Не рекомендуется использовать обёртки: в большинстве случаев значения будут примитивами, и прямое наследование интерфейса от типа-обёртки приведёт к ошибкам. Лучше всегда использовать string, number, boolean.

Примеры реальных ошибок из-за незнания тонкостей темы


История

В веб-приложении для хранения ФИО был использован тип String в интерфейсе пользователя. Это привело к ошибкам сравнения и неправильному прохождению unit-тестов, требующих строго идентичных типов (примитивы и их обёртки различаются по идентичности).


История

Библиотечный разработчик типизировал generic-функцию через Number, и клиенты библиотеки подсунули примитивные значения, что вызвало проблемы с методом type guards, неожиданно не сработавших для примитивов. Возникла сложная к отладке ошибка приведения типов.


История

В аналитическом сервисе был использован тип Boolean для флага активности пользователя, и результат сравнения возле фильтрации данных всегда был false, хотя визуально значения совпадали. Вызвало некорректную обработку данных и падение отчётов.