Утверждение типа (Type Assertion) — это способ сообщить TypeScript: "Я знаю тип этого значения лучше, чем ты". Синтаксис: с помощью ключевого слова as (например, value as string) или угловых скобок ().
Это мощный инструмент, но использовать его нужно осторожно, так как он отключает проверку типов в данном месте и может привести к ошибкам во время выполнения, если утверждение окажется неверным. Обычно применяется при работе с DOM, при получении данных из внешних источников (API) или при сужении типов после проверок.
Практические задания этого урока научат вас корректно применять as в типичных сценариях, избегая распространённых ошибок.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Утверждение типа (as).
- Угловые скобки ().
- Non-null assertion (!).
- as const.
- Двойное утверждение (as unknown as T).
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Синтаксис as
В этом задании вам нужно дополнить код для работы с DOM-элементом. TypeScript не всегда может определить точный тип HTML-элемента при получении его через document.getElementById. Используйте утверждение типа (type assertion) с ключевым словом 'as', чтобы указать точный тип элемента. Заполните пропуски, чтобы код корректно работал со свойством value элемента input.
// Получаем элемент из DOM
const inputElement = document.getElementById('userInput') input1S input2S;
// Теперь мы можем безопасно обращаться к свойству value
console.log(inputElement.value);2. Найди утверждения типа
Перед вами фрагмент кода на TypeScript, содержащий несколько мест с утверждениями типа (type assertions) и без них. Внимательно изучите код. Ваша задача — найти и выделить все места, где используется оператор утверждения типа `as`. Не отмечайте другие операторы, похожие на `as` (например, в сравнениях или других контекстах), и не отмечайте части кода, где утверждение типа отсутствует.
interface User {
name: string;
age: number;
}
const data: unknown = { name: "Alice", age: 30 };
// Утверждение типа с as
const user1 = {{data as User~|~t1}};
// Альтернативный синтаксис (не использует as)
const user2 = <User>data;
// Пример с массивом
const items: unknown[] = [1, 2, 3];
const numbers = {{items as number[]~|~t2}};
// Ложная цель: as в сравнении
const isUser = data {{as~|~t3}} any;
// Ещё одно утверждение типа
function getValue(): unknown {
return "hello";
}
const strValue = {{getValue() as string~|~t4}};
// Ложная цель: as в комментарии
// Этот as не является оператором
console.log("Done");3. Опасное утверждение
В этом фрагменте кода TypeScript используется опасное утверждение типа `as`, которое может привести к ошибке во время выполнения, если переменная `data` окажется не строкой. Найдите строку с утверждением и замените его на безопасную проверку типа с помощью оператора `typeof`.
// Получаем данные из неизвестного источникаlet data: unknown = "Hello, world!";// Опасное утверждение типаlet messageLength: number = (data as string).length;console.log(messageLength);4. Собери безопасное приведение
Из предложенных строк соберите корректную функцию на TypeScript, которая безопасно приводит тип элемента после проверки его тега. Функция принимает элемент типа `Element | null` и возвращает его значение `value` как строку, если это элемент ``, иначе возвращает `null`. Для проверки используйте свойство `tagName` и утверждение типа с помощью `as`. В решении должны быть использованы только необходимые строки, лишние — игнорируйте.
function getInputValue(element: Element | null): string | null { if (element && element.tagName === 'INPUT') { return (element as HTMLInputElement).value; } return null;} if (element instanceof HTMLInputElement) { return element.value; console.log(element);5. Что выведет код?
Проанализируйте приведённый фрагмент кода на TypeScript. Внимательно изучите, как используется утверждение типа (as) для переменной с типом unknown, и определите, что произойдёт при попытке выполнения этого кода. Выберите один правильный вариант из предложенных.
let value: unknown = "123.45";
let num = value as number;
console.log(num.toFixed(1));6. Уместно vs Рискованно
Перед вами 8 примеров кода TypeScript, демонстрирующих использование утверждения типа (as). Вам необходимо распределить каждый пример по одной из двух категорий: «Уместное использование утверждения типа» или «Рискованное/неуместное использование». Уместное использование подразумевает ситуации, когда тип данных известен из контекста и утверждение безопасно, а рискованное — когда утверждение может скрыть ошибки типов или привести к сбоям во время выполнения.
const element = document.getElementById('myCanvas') as HTMLCanvasElement;const data: any = getData();
const user = data as User;function getLength(value: string | number): number {
if (typeof value === 'string') {
return (value as string).length;
}
return value.toString().length;
}const obj = {} as { name: string, age: number };
obj.name = 'Alice';const input = document.querySelector('input[type="text"]') as HTMLInputElement;const unknownValue: unknown = JSON.parse('{"x": 10}');
const point = unknownValue as { x: number, y: number };
console.log(point.y);function process<T>(item: T): T {
// Некоторая логика
return item as T;
}const num = 123 as string;7. Анализ кода с утверждениями
Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа получает элемент из DOM, использует утверждение типа (as) для работы с ним, обрабатывает данные и выводит результат в консоль.
// Входные данные: в DOM есть элемент <input id="userAge" value="25">
const ageElement = document.getElementById('userAge');
if (ageElement) {
const input = ageElement as HTMLInputElement;
const ageString = input.value;
const age = parseInt(ageString);
if (!isNaN(age)) {
console.log(`В следующем году вам будет ${age + 1} лет.`);
} else {
console.log('Некорректный возраст');
}
} else {
console.log('Элемент не найден');
}8. Последствие неверного as
Рассмотрите фрагмент кода на TypeScript, в котором переменной типа any присваивается строковое значение, а затем выполняется утверждение типа (as) для приведения к number. Определите, что произойдёт при попытке выполнения этого кода. Введите короткую строку, описывающую результат (например, 'ошибка TypeError' или конкретное строковое значение).
const x: any = '123';
const y = (x as number).toFixed(2);