0Pricing
TypeScript Academy · Урок

unknown и any: более безопасный выбор

Узнайте, почему unknown заставляет проверять типы перед использованием.

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

Добро пожаловать

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

Проблема типа any

При использовании `any` TypeScript отключает все проверки. Вы можете вызывать методы, обращаться к свойствам и присваивать значение переменным с определённым типом без ограничений и без гарантии безопасности.
let val: any = getData();
val.someMethod(); // TypeScript: OK. Runtime: possible crash

Знакомство с unknown

`unknown` — безопасный надтип. Как и `any`, он может содержать любое значение. Но, в отличие от `any`, его нельзя использовать без предварительного сужения типа.
let val: unknown = getData();
// val.someMethod(); // Error: Object is of type 'unknown'

Сужение unknown перед использованием

Чтобы использовать значение типа `unknown`, необходимо сузить его с помощью проверки типа. После этого TypeScript разрешает операции, допустимые для суженного типа.
let input: unknown = getInput();
if (typeof input === 'string') {
  console.log(input.toUpperCase()); // OK — narrowed to string
}

unknown нельзя присвоить конкретному типу

Нельзя присвоить `unknown` конкретному типу без проверки или утверждения. Это заставляет Вас проверять значение перед использованием.
let x: unknown = 'hello';
// let s: string = x; // Error
let s: string = x as string; // OK with assertion

Использование unknown в блоках обработки исключений

В TypeScript 4.0 и более новых версиях перехваченные ошибки по умолчанию имеют тип `unknown`. Это безопаснее прежнего значения `any`, поскольку заставляет Вас проверить тип ошибки.
try {
  doSomething();
} catch (err: unknown) {
  if (err instanceof Error) {
    console.log(err.message); // safe
  }
}

unknown для внешних данных

При разборе JSON или получении данных через API сначала указывайте для них тип `unknown`, а затем проверяйте их перед использованием.
const raw: unknown = JSON.parse(text);
if (
  typeof raw === 'object' &&
  raw !== null &&
  'name' in raw
) {
  console.log((raw as any).name);
}

Защитники типов для unknown

Пользовательские защитники типов отлично работают с `unknown` и позволяют проверить сложную структуру данных перед использованием.
function isUser(val: unknown): val is { name: string } {
  return typeof val === 'object' && val !== null && 'name' in val;
}

unknown и never

`unknown` — надтип: ему можно присвоить значение любого типа. `never` — подтип: ему нельзя присвоить значение никакого типа. Это противоположные понятия.
// unknown: anything can be assigned to it
let a: unknown = 42; // OK

// never: nothing can be assigned to it
function fail(): never { throw new Error(); }

Выбор между any и unknown

Используйте `unknown`, когда получаете данные неопределённого типа: JSON, пользовательский ввод или данные внешних API. Используйте `any` только в крайнем случае — при переносе кода или работе с библиотеками без типов.

Библиотеки проверки во время выполнения

Библиотеки Zod, Valibot и io-ts отлично сочетаются с `unknown`. Они разбирают и проверяют данные, возвращая значение с корректным типом из входного значения `unknown`.
import { z } from 'zod';
const UserSchema = z.object({ name: z.string(), age: z.number() });
const user = UserSchema.parse(unknownData); // throws if invalid

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

Что необходимо сделать, прежде чем использовать значение типа `unknown` в TypeScript?

Итоги

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

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

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

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

Чему я научусь в уроке «unknown и any: более безопасный выбор»?

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

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

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

Сколько времени занимает урок «unknown и any: более безопасный выбор»?

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

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

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

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

  1. Примитивные типы: string, number, boolean
  2. Тип any и почему его стоит избегать
  3. unknown и any: более безопасный выбор
  4. null, undefined и строгая проверка на null
← Назад к TypeScript Academy