Иногда TypeScript запрещает приведение типов, если считает их несовместимыми (например, превращение string прямо в number). В таких случаях используется техника двойного утверждения (double assertion).
Суть метода заключается в приведении значения сначала к «всеядному» типу unknown (или any), а затем — к целевому типу.
const num = "42" as unknown as number;
Хотя это позволяет «обмануть» компилятор, использовать этот прием нужно с осторожностью, понимая риски возникновения ошибок в рантайме. Этот тренажер научит вас синтаксису и ситуациям, где это действительно необходимо.
- Модуль 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. Ошибка прямого кастинга
В этом фрагменте TypeScript-кода есть ошибка, связанная с прямым приведением типов. Код пытается напрямую привести строку к числу, что вызывает ошибку компиляции. Вам нужно исправить строку с ошибкой, используя двойное утверждение через unknown, чтобы обойти ограничения системы типов. Обратите внимание на синтаксис утверждения типов в TypeScript.
let strValue: string = "123";let numValue: number = strValue as number;console.log(numValue);2. Совместимость типов
Перед вами пары типов TypeScript. Распределите их по двум категориям: 'Нужно двойное утверждение' (когда типы не имеют пересечения) и 'Хватит одинарного' (когда есть пересечение, например, один тип является подтипом другого). Обратите внимание, что двойное утверждение (as unknown as T) требуется для преобразования между типами без общего пересечения, в то время как одинарное (as T) достаточно при наличии совместимости.
3. Цепочка утверждений
Из предложенных строк соберите корректную TypeScript-программу, которая объявляет интерфейс User, создаёт объект, а затем с помощью двойного утверждения (as unknown as T) приводит этот объект к типу User. Программа должна вывести в консоль свойство name из приведённого объекта. Игнорируйте лишние строки, которые не требуются для решения задачи.
interface User { name: string; }const data = { username: 'alice' };const user = data as unknown as User;console.log(user.name);const user = data as User;console.log(data.username);4. Поиск небезопасных мест
В представленном фрагменте кода на TypeScript внимательно изучите каждую строку. Ваша задача — найти и выделить кликом все места, где используется конструкция двойного утверждения типов `as unknown as`. Эта конструкция позволяет обойти проверку типов, преобразуя выражение сначала в `unknown`, а затем в целевой тип, что может быть небезопасно. Отмечайте только полные конструкции `as unknown as` вместе с указанием целевого типа (например, `as unknown as string`). Не отмечайте одиночные утверждения `as`, использование типа `unknown` в других контекстах или другие части кода.
let data: any = fetchData();
// Преобразование с двойным утверждением
let name: string = {{data as unknown as string~|~t1}};
// Одиночное утверждение (не отмечать)
let age: number = {{data as number~|~t2}};
// Ещё одно двойное утверждение в массиве
let ids: number[] = {{data as unknown as number[]~|~t3}};
// Использование unknown без as (не отмечать)
let unknownVar: {{unknown~|~t4}} = data;
// Двойное утверждение в возврате функции
function parse(input: any): string {
return {{input as unknown as string~|~t5}};
}
// Безопасное утверждение через as (не отмечать)
let safe: boolean = {{data as boolean~|~t6}};