TypeScript Academy · Урок

Типобезопасная работа с unknown

Сужайте значения unknown, прежде чем безопасно их использовать

Урок 4 из 413 шагов

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

Безопасная работа с неизвестными значениями

Типизация внешних данных как unknown — только половина задачи. Вторая половина — сузить тип до конкретного типа перед использованием. В этом уроке рассматриваются основные методы сужения типа.

function describe(v: unknown): string {
  if (typeof v === 'string') return 'string: ' + v;
  if (typeof v === 'number') return 'number: ' + v;
  return 'other';
}
console.log(describe('hi'), describe(7), describe(true));

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

Защитная проверка typeof — самый простой инструмент. Она сужает unknown до примитивных типов: string, number, boolean, function, object и других.

function double(v: unknown): number {
  if (typeof v === 'number') {
    return v * 2; // v is number here
  }
  return 0;
}
console.log(double(21), double('no'));

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

Для экземпляров классов используйте instanceof. Он сужает unknown до конкретного класса, безопасно открывая доступ к его методам и свойствам.

function handle(v: unknown): string {
  if (v instanceof Date) {
    return v.toISOString(); // v is Date
  }
  return 'not a date';
}
console.log(handle(new Date(0)));

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

Оператор in проверяет, существует ли свойство у объекта, и сужает тип значений, являющихся объектами. Сначала убедитесь, что значение — объект, отличный от null, а затем проверьте его ключи.

function getName(v: unknown): string {
  if (typeof v === 'object' && v !== null && 'name' in v) {
    return String((v as { name: unknown }).name);
  }
  return 'anonymous';
}
console.log(getName({ name: 'Ada' }), getName(5));

Пользовательские проверки типа

Пользовательская проверка типа — это функция, возвращаемый тип которой имеет вид value is T. Когда она возвращает true, TypeScript сужает тип аргумента до T в месте вызова.

function isString(v: unknown): v is string {
  return typeof v === 'string';
}

function shout(v: unknown): string {
  return isString(v) ? v.toUpperCase() : '?';
}
console.log(shout('hey'), shout(9));

Проверки структуры объектов

Пользовательские проверки особенно полезны для проверки структуры объектов. Напишите одну функцию, которая проверяет все обязательные поля, и остальной код сможет доверять суженному типу.

type User = { id: number; name: string };

function isUser(v: unknown): v is User {
  return typeof v === 'object' && v !== null &&
    'id' in v && 'name' in v;
}
console.log(isUser({ id: 1, name: 'Sam' }), isUser({}));

JSON.parse возвращает данные неизвестного типа

Тип результата JSON.parse — any, что незаметно обходит проверки безопасности. Рекомендуемый подход: сохранить результат как unknown и проверить его, прежде чем доверять структуре данных.

function parseConfig(text: string): unknown {
  return JSON.parse(text);
}
const raw = parseConfig('{"port":8080}');
console.log(typeof raw);

Проверка разобранного JSON

Объедините JSON.parse с проверкой типа, чтобы безопасно преобразовать ненадёжный текст в типизированное значение. Если проверка не пройдена, обработайте ошибку, а не доверяйте некорректным данным.

type Config = { port: number };

function isConfig(v: unknown): v is Config {
  return typeof v === 'object' && v !== null &&
    'port' in v && typeof (v as any).port === 'number';
}

const data: unknown = JSON.parse('{"port":8080}');
if (isConfig(data)) console.log('Port:', data.port);

Цепочка из нескольких проверок

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

function process(v: unknown): string {
  if (Array.isArray(v)) {
    if (v.every((x) => typeof x === 'string')) {
      return v.join('-');
    }
  }
  return 'invalid';
}
console.log(process(['a', 'b']), process([1, 2]));

Выбрасывание ошибки при недопустимых данных

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

function asNumber(v: unknown): number {
  if (typeof v === 'number') return v;
  throw new Error('Expected a number');
}
console.log(asNumber(42));
try { asNumber('x'); } catch (e) { console.log('rejected'); }

Объединяем всё изученное

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

type Point = { x: number; y: number };
function isPoint(v: unknown): v is Point {
  return typeof v === 'object' && v !== null &&
    'x' in v && 'y' in v;
}
const input: unknown = { x: 1, y: 2 };
if (isPoint(input)) console.log(input.x + input.y);

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

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

Повторение: обработка неизвестных значений

Вы научились сужать unknown с помощью:

  • typeof для примитивов и instanceof для экземпляров классов.
  • Оператора in для свойств объектов.
  • Пользовательских проверок типа, возвращающих value is T.
  • Проверки результатов JSON.parse перед тем, как им доверять.

Следующий курс: утверждения типов и приведение типов.

function isNonEmpty(v: unknown): v is string {
  return typeof v === 'string' && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));
Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

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

Курсы
101
Уроки
352

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

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

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

Чему я научусь в уроке «Типобезопасная работа с unknown»?

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

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

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

Сколько времени занимает урок «Типобезопасная работа с unknown»?

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

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

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

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

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