Чем отличается тип any от unknown?

В TypeScript типы any и unknown часто сравниваются, потому что оба они позволяют работать с переменными, тип которых заранее неизвестен. На первый взгляд может показаться, что это схожие механизмы, однако у них есть принципиальные различия, влияющие на безопасность и удобство работы с кодом.

Тип any

any — это наиболее "свободный" тип в TypeScript. Он отключает систему проверки типов для переменной.

  • Переменной с типом any можно присвоить любое значение: число, строку, объект или функцию.

  • После этого с ней можно выполнять любые операции, и компилятор не будет выдавать ошибок, даже если они потенциально некорректные.

Например, если у нас есть переменная с типом any, мы можем вызвать у неё любой метод, даже если он отсутствует, и ошибка возникнет только во время выполнения программы. Таким образом, использование any снижает преимущества TypeScript, так как убирает статическую проверку.

Тип unknown

unknown — это более безопасная альтернатива any.

  • Переменной с типом unknown также можно присвоить любое значение.

  • Однако, в отличие от any, перед использованием значения требуется явно проверить его тип или выполнить приведение типов.

Это означает, что если мы попытаемся вызвать метод у переменной типа unknown, компилятор выдаст ошибку, пока мы не докажем системе типов, что значение действительно поддерживает такую операцию.

Пример: чтобы обратиться к свойству объекта, нужно использовать оператор typeof, instanceof или написать пользовательскую проверку. Такой подход помогает предотвращать ошибки ещё на этапе компиляции.

Основные отличия any и unknown

  1. Поведение при компиляции:

    • any позволяет выполнять любые операции без ограничений.

    • unknown требует проверки или приведения типа перед использованием.

  2. Безопасность кода:

    • any отключает типизацию, что может привести к ошибкам во время выполнения.

    • unknown сохраняет строгую типизацию и заставляет разработчика явно подтверждать корректность действий.

  3. Сфера применения:

    • any используется редко, обычно в случаях, когда невозможно описать тип, например при работе со сторонними библиотеками без типов.

    • unknown предпочтителен, если нужно принять произвольное значение, но при этом сохранить контроль над тем, что можно с ним делать.

Практическое применение

В реальных проектах использование any может значительно упростить написание кода, но это всегда компромисс между скоростью разработки и безопасностью. Частое применение any превращает TypeScript практически в обычный JavaScript, где ошибки проявляются только на этапе выполнения.

Тип unknown, наоборот, идеально подходит для работы с внешними данными, например с ответами API, когда структура заранее неизвестна. Он заставляет разработчика явно проверять данные перед использованием, что повышает надёжность и снижает риск критических ошибок.