0Pricing
TypeScript Academy · Урок

Понимание unknown и any

Узнайте, почему unknown — типобезопасная альтернатива any

«Понимание unknown и any» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Два верхних типа

В TypeScript есть два типа, способных содержать любое значение: any и unknown. Они выглядят похоже, но ведут себя совершенно по-разному. Выбор правильного типа — ключевой навык для безопасного с точки зрения типов кода.

let a: any = 5;
let u: unknown = 5;
console.log(a, u);

Произвольный тип отключает проверку типов

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

const a: any = 'hello';
console.log(a.toUpperCase()); // OK
// a.doesNotExist(); // no compile error, but crashes at runtime

Неизвестный тип требует проверки

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

const u: unknown = 'hello';
// console.log(u.toUpperCase()); // Error: u is unknown
console.log(typeof u);

Сужение неизвестного типа с помощью проверки типа

Проверка typeof сужает unknown до конкретного типа внутри блока. После сужения все методы этого типа становятся безопасно доступными.

function shout(value: unknown): string {
  if (typeof value === 'string') {
    return value.toUpperCase(); // safe here
  }
  return 'not a string';
}
console.log(shout('hi'), shout(42));

Почему неизвестный тип безопаснее

unknown представляет честную неопределённость: «Я пока не знаю, что это такое». Он заставляет проверять значение перед использованием и обнаруживает ошибки во время компиляции. any лишь скрывает неопределённость и ошибки.

function len(value: unknown): number {
  if (typeof value === 'string') return value.length;
  if (Array.isArray(value)) return value.length;
  return 0;
}
console.log(len('abc'), len([1, 2]), len(99));

Присваивание неизвестному типу и из него

Любое значение можно присвоить unknown. Но unknown можно присвоить только unknown или any, но не конкретному типу без сужения. Именно эта асимметрия обеспечивает безопасность.

let u: unknown = 10;
u = 'now a string';
u = true;
const anyVal: any = u; // allowed
console.log(anyVal);
// const s: string = u; // Error

Произвольный тип распространяется по коду

Опасное свойство any — его способность распространяться. Как только значение получает тип any, всё, что из него выводится, тоже получает тип any, незаметно разрушая безопасность типов во всей программе.

const a: any = { count: 5 };
const total = a.count + 10; // total is any
const flag = total.whatever; // still any, no error
console.log(total);

Неизвестный тип локализует риск

С типом unknown неопределённость остаётся на месте. Вы должны явно сужать тип на каждой границе, поэтому небезопасные операции не могут проникнуть дальше. Риск остаётся там, где ему и следует быть.

const u: unknown = { count: 5 };
if (typeof u === 'object' && u !== null && 'count' in u) {
  console.log('Has count property');
}

Типизация границ API и JSON

Внешние данные — JSON, ответы сети и пользовательский ввод — не имеют гарантий. Если типизировать их как unknown, а не как any, компилятор заставит проверять их до того, как Вы им доверитесь, что является безопасным вариантом по умолчанию.

function parse(text: string): unknown {
  return JSON.parse(text);
}
const data = parse('{"id":1}');
if (typeof data === 'object' && data !== null) {
  console.log('Got an object');
}

Когда допустим произвольный тип

any иногда бывает практичным решением — для быстрых прототипов, постепенного переноса с JavaScript или взаимодействия с библиотеками без типов. Но относитесь к нему как к временному маркеру, а не как к привычке. По возможности предпочитайте unknown.

// Migration placeholder, to be typed later
let legacy: any = getLegacyValue();
function getLegacyValue() { return { x: 1 }; }
console.log(legacy.x);

Практическое сравнение

Сравним варианты: версия с any компилируется, но может завершиться сбоем; версия с unknown отказывается компилироваться из-за небезопасного доступа. Компилятор выполняет свою работу — защищает Вас.

const a: any = 42;
console.log(a.toFixed(2)); // OK by luck

const u: unknown = 42;
if (typeof u === 'number') {
  console.log(u.toFixed(2)); // checked, safe
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли различия между unknown и any.

Повторение: неизвестный и произвольный типы

Основные положения:

  • any отключает проверку типов и распространяется на производные значения.
  • unknown принимает любое значение, но блокирует его использование, пока Вы не выполните его сужение.
  • Используйте unknown для внешних данных (JSON, программные интерфейсы, пользовательский ввод), чтобы обеспечить их проверку.
  • Оставляйте any для переноса или взаимодействия с кодом без типов, используя его как временный маркер.

Далее мы изучим пустой тип: never.

function safeLen(v: unknown): number {
  return typeof v === 'string' ? v.length : 0;
}
console.log(safeLen('hello'), safeLen(123));

Часто задаваемые вопросы

Урок «Понимание unknown и any» бесплатный?

Да — полный текст урока «Понимание unknown и any» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Понимание unknown и any»?

Узнайте, почему unknown — типобезопасная альтернатива any Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Понимание unknown и any»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Понимание unknown и any
  2. Тип never и невозможные состояния
  3. Тип void в функциях
  4. Типобезопасная работа с unknown
← Назад к TypeScript Academy