логотип PurpleSchool
Иконка входа
Вход
логотип PurpleSchool

Как правильно использовать тип Unknown

Автор

Василий Майоров

Тип any (любой) — это тип в TypeScript, подходящий к чему угодно. Поскольку он охватывает типы всех возможных значений, то не заставляет нас делать какие-либо проверки, прежде чем мы попытаемся эти значения вызывать, конструировать или получать доступ к их свойствам. Он также позволяет присвоить значения типа any переменным, которые ожидают значений любого другого типа.

Эта возможность в целом полезна, но не может обеспечить достаточную строгость.

Главное отличие unknown от any связано с проверкой типов. unknown запрещает выполнять любые операции:

let value: unknown = "code-basics";

value.toUpperCase(); // Error!
value.trim(); // Error!

Может показаться странным, что перед нами строка, но над ней нельзя выполнять строковые операции. К этому надо привыкнуть. Тип в статически типизированных языках определяется не тем, что мы видим своими глазами, а тем, как тип выводится (автоматически или через явное указание)

Пример выше на практике смысла не имеет, но все меняется, когда нам приходится создавать функцию, которая может работать с любым входящим типом. В JavaScript подобная практика достаточно распространена:

// Пример из lodash
_.isError(new Error()); // true
_.isError(Error); // false
_.isError("code-basics"); // false

Подобную функцию можно реализовать с помощью any, но тогда придется быть очень аккуратным внутри и надеяться только на себя.

function isError(value: any);

Лучше использовать unknown, тогда TypeScript защитит от потенциальных ошибок типов:

function isError(value: unknown);

Затем, уже внутри тела можно выполнить нужную проверку, чтобы узнать с чем мы имеем дело:

function isError(value: unknown) {
  return value instanceof Error;
}

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile