Понимание 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 — локальная установка не требуется.
Все уроки этого курса
- Понимание unknown и any
- Тип never и невозможные состояния
- Тип void в функциях
- Типобезопасная работа с unknown