Василий Майоров
Как правильно использовать тип 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