Что такое type assertion в TypeScript?

JuniorTypeScript · Frontend·Обновлено 25 июля 2026
Коротко
Type assertion — это явное указание TypeScript, каким типом следует считать значение, без реального преобразования данных в рантайме. Это способ сказать компилятору «я знаю тип лучше тебя».

Type assertion в TypeScript

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

Синтаксис

Существует два варианта записи:

// Синтаксис «as» (рекомендуемый)
const value = someValue as string;

// Угловые скобки (не работает в .tsx-файлах)
const value = <string>someValue;

В React-проектах с JSX следует всегда использовать синтаксис as, потому что угловые скобки конфликтуют с JSX-тегами.

Когда применяется

1. Работа с DOM-элементами

TypeScript не знает точный тип элемента, возвращаемого querySelector, поэтому возвращает Element | null.

const input = document.querySelector('#email') as HTMLInputElement;
input.value = 'user@example.com'; // без assertion — ошибка, у Element нет .value

2. Сужение типа из unknown

function processData(data: unknown) {
  const user = data as { name: string; age: number };
  console.log(user.name);
}

3. Работа с данными из внешних источников

const response = await fetch('/api/user');
const user = (await response.json()) as User;

Важные ограничения

Type assertion не выполняет реального преобразования данных — это исключительно инструкция компилятору. В рантайме никакого приведения типов не происходит.

TypeScript позволяет делать assertion только в «разумных» пределах: тип должен перекрываться с исходным. Для обхода этого ограничения используют двойное утверждение через unknown:

const value = 42 as unknown as string; // допускается, но опасно

Type assertion vs Type casting

В языках вроде C# или Java приведение типов изменяет значение в рантайме. В TypeScript assertion существует только на этапе компиляции и полностью исчезает из скомпилированного JavaScript.

Non-null assertion operator

Отдельный вид assertion — постфиксный оператор !, который убирает null и undefined из типа:

const el = document.getElementById('root')!; // тип HTMLElement, не HTMLElement | null
el.innerHTML = 'Hello';

Когда не стоит использовать

Type assertion — это «обещание» компилятору, которое разработчик берёт на себя. Если assertion окажется неверным, TypeScript не предупредит, и программа упадёт в рантайме. Предпочтительнее использовать type guard или проверки с instanceof / typeof, когда это возможно.

Что хочет услышать интервьюер

Понимание того, что assertion не преобразует данные в рантайме, а только влияет на тип при компиляции

Знание двух синтаксисов: `as Type` и `<Type>`, и понимание ограничений в .tsx-файлах

Умение объяснить типичные сценарии применения: DOM-элементы, JSON-ответы, тип unknown

Понимание опасности неверного assertion и когда лучше использовать type guard вместо него

Знание non-null assertion оператора `!` как частного случая

Пример: Основные сценарии применения type assertion

// Базовый синтаксис
const input = document.querySelector('#search') as HTMLInputElement;
input.focus(); // TypeScript знает, что это HTMLInputElement

// Non-null assertion
const container = document.getElementById('app')!;
container.innerHTML = '<p>Загрузка...</p>';

// Работа с JSON из API
interface Product {
  id: number;
  name: string;
  price: number;
}

async function fetchProduct(id: number): Promise<Product> {
  const response = await fetch(`/api/products/${id}`);
  // Говорим TypeScript, что JSON соответствует нашему интерфейсу
  return response.json() as Promise<Product>;
}

// Сужение из union-типа
type Shape = { kind: 'circle'; radius: number } | { kind: 'square'; side: number };

function getArea(shape: Shape): number {
  if (shape.kind === 'circle') {
    // TypeScript сам сужает тип — assertion здесь не нужен (лучший подход)
    return Math.PI * shape.radius ** 2;
  }
  return (shape as { kind: 'square'; side: number }).side ** 2; // assertion как альтернатива
}

Пример: Сравнение assertion и type guard

// Опасное использование — TypeScript не защитит в рантайме
const num = 42;
const str = num as unknown as string;
console.log(str.toUpperCase()); // ошибка в рантайме!

// Безопасная альтернатива — type guard
function isString(value: unknown): value is string {
  return typeof value === 'string';
}

const data: unknown = getData();
if (isString(data)) {
  console.log(data.toUpperCase()); // TypeScript знает тип, и это действительно строка
}

function getData(): unknown {
  return 'hello';
}

Типичные ошибки

Путают type assertion с реальным приведением типов (casting) из других языков — думают, что данные преобразуются

Используют assertion вместо type guard, создавая потенциальные ошибки в рантайме

Злоупотребляют двойным assertion `as unknown as T`, чтобы обойти проверки компилятора без понимания рисков

Не знают об ограничении синтаксиса с угловыми скобками в JSX-файлах

Путают `as` assertion с `satisfies` оператором, появившимся в TypeScript 4.9

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.5
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее