← Назад к вопросам

Чем отличаются типы any, unknown и never в TypeScript?

2.2 Middle🔥 172 комментариев
#TypeScript

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличие типов any, unknown и never в TypeScript

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

Тип any: Отказ от проверки типов

any — это наиболее опасный, но и самый "свободный" тип в TypeScript. Когда переменной присваивается тип any, компилятор TypeScript полностью отказывается от проверки типов для этой переменной.

let anything: any = 42;
anything = "теперь строка"; // ОК
anything = true; // ОК
anything.someMethod(); // ОК во время компиляции (но вызовет ошибку времени выполнения!)

Ключевые особенности any:

  • Полностью отключает проверку типов
  • Позволяет присваивать значения любого типа
  • Позволяет обращаться к любым свойствам и методам
  • Сводит на нет преимущества TypeScript
  • Следует использовать только в крайних случаях (при миграции с JavaScript или работе с динамическим контентом)

Тип unknown: Безопасная альтернатива any

unknown появился в TypeScript 3.0 как типобезопасная альтернатива any. Он представляет собой значение, тип которого неизвестен на этапе компиляции, но в отличие от any, с ним нельзя выполнять произвольные операции без явной проверки или приведения типа.

let uncertainValue: unknown = "Привет, мир!";

// Ошибки компиляции:
// uncertainValue.toUpperCase(); // Ошибка: объект имеет тип "unknown"
// let str: string = uncertainValue; // Ошибка: тип "unknown" не может быть присвоен типу "string"

// Безопасное использование через проверку типа:
if (typeof uncertainValue === "string") {
    console.log(uncertainValue.toUpperCase()); // Теперь ОК
}

// Или через приведение типа (type assertion):
let strLength: number = (uncertainValue as string).length;

Ключевые особенности unknown:

  • Требует явной проверки или приведения типа перед использованием
  • Запрещает произвольные операции со значением
  • Может быть присвоен любой тип
  • Представляет собой типобезопасный способ работы с динамическими данными
  • Всегда предпочтительнее any, когда тип не известен заранее

Тип never: Тип для невозможных значений

never представляет собой тип значений, которые никогда не возникают. Это подтип всех других типов, но сам по себе не имеет ни одного значения.

// Функция, которая всегда выбрасывает исключение
function throwError(message: string): never {
    throw new Error(message);
}

// Функция с бесконечным циклом
function infiniteLoop(): never {
    while (true) {
        // что-то делаем
    }
}

// Обработка всех вариантов в switch (exhaustive checking)
type Shape = "circle" | "square" | "triangle";

function getArea(shape: Shape): number {
    switch (shape) {
        case "circle": return Math.PI;
        case "square": return 1;
        case "triangle": return 0.5;
        default:
            // Если добавить новый тип в Shape, здесь будет ошибка компиляции
            const exhaustiveCheck: never = shape;
            return exhaustiveCheck;
    }
}

Ключевые особенности never:

  • Представляет значения, которые никогда не существуют
  • Используется для функций, которые всегда выбрасывают исключение или имеют бесконечный цикл
  • Применяется для исчерпывающей проверки типов (exhaustive checking)
  • Является подтипом всех типов, но сам не имеет значений
  • Никакой тип не может быть присвоен never (кроме самого never)

Сравнительная таблица

Критерийanyunknownnever
Проверка типовОтключенаТребуется явная проверкаНе применимо (нет значений)
ПрисваиваемостьЛюбой типЛюбой типНикакой тип (кроме never)
ИспользованиеБез ограниченийТолько после проверки типаНе может быть использовано
БезопасностьНизкаяВысокаяАбсолютная
Типовые сценарииМиграция с JS, динамический кодAPI с неизвестным ответом, парсинг JSONФункции-исключения, exhaustive checking

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

  1. Избегайте any в новом коде — используйте его только при крайней необходимости или при интеграции с нетипизированными библиотеками.

  2. Предпочитайте unknown вместо any, когда работаете с динамическими данными — это заставит вас явно проверять типы, делая код безопаснее.

  3. Используйте never для функций, которые никогда не возвращают управление, и для исчерпывающих проверок в условных конструкциях.

  4. Помните, что unknown — это типобезопасная версия any, а never — это способ сообщить компилятору о ситуациях, которые "никогда не должны происходить".

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