Двойное утверждение (as unknown as T)

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Иногда TypeScript запрещает приведение типов, если считает их несовместимыми (например, превращение string прямо в number). В таких случаях используется техника двойного утверждения (double assertion).

Суть метода заключается в приведении значения сначала к «всеядному» типу unknown (или any), а затем — к целевому типу.

const num = "42" as unknown as number;

Хотя это позволяет «обмануть» компилятор, использовать этот прием нужно с осторожностью, понимая риски возникновения ошибок в рантайме. Этот тренажер научит вас синтаксису и ситуациям, где это действительно необходимо.

Список тем

1. Ошибка прямого кастинга

id: 40740_da_02_error

В этом фрагменте TypeScript-кода есть ошибка, связанная с прямым приведением типов. Код пытается напрямую привести строку к числу, что вызывает ошибку компиляции. Вам нужно исправить строку с ошибкой, используя двойное утверждение через unknown, чтобы обойти ограничения системы типов. Обратите внимание на синтаксис утверждения типов в TypeScript.

Найдите ошибку и исправьте
let strValue: string = "123";
let numValue: number = strValue as number;
console.log(numValue);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Совместимость типов

id: 40740_da_03_sort

Перед вами пары типов TypeScript. Распределите их по двум категориям: 'Нужно двойное утверждение' (когда типы не имеют пересечения) и 'Хватит одинарного' (когда есть пересечение, например, один тип является подтипом другого). Обратите внимание, что двойное утверждение (as unknown as T) требуется для преобразования между типами без общего пересечения, в то время как одинарное (as T) достаточно при наличии совместимости.

Перетяните элементы в соответствующие блоки
Нужно двойное утверждение
Хватит одинарного
string → number
string → any
number → string
{ a: number } → { b: string }
HTMLElement → Element
unknown → string
never → string
(a: string) => void → (a: number) => void
Array<string> → Array<any>
{ a: number, b: string } → { a: number }
Сообщения
Проверить
Показать подсказку

3. Цепочка утверждений

id: 40740_da_04_build

Из предложенных строк соберите корректную 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Поиск небезопасных мест

id: 40740_da_06_click

В представленном фрагменте кода на 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}};
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40740_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру