подсказчик: как в TypeScript сообщить системе типов: «Я знаю, что теоретически это значение может иметь эти несколько типов, но на практике я знаю, что оно будет иметь только этот»
TypeScript позволяет использовать типы объединения на основе нескольких существующих типов (называемых типами-членами). Например, функция, которая работает со строками или числами, может быть определена как ```function printId(id: число | строка)```.

Значение соответствует типу объединения, если оно соответствует любому из членов типа объединения. В данном примере первым параметром `printId` (то есть `id`) может быть либо `число`, либо `строка`.

TypeScript разрешает операции со значением типа объединения только в двух условиях.
(1) Если это действительно для каждого члена союза, ИЛИ
(2) Если вы пишете код, который позволяет TypeScript выводить определенный тип. Например, код в условном выражении типа if (typeof id === "string") {}``` может выполнять любую операцию, допустимую для строк. Таким образом, вы можете использовать код, чтобы указать TypeScript, что определенный код применяется только тогда, когда значение имеет один определенный тип. Это называется «сужение». Для этого не нужно определять ничего особенного.

Если вы хотите, чтобы TypeScript проверял во время компиляции, что определенное значение имеет определенный тип, вы всегда можете использовать утверждения типа. Например, ```const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;`` добавляет утверждение, что результат вызова `getElementById` всегда должен иметь тип `HTMLCanvasElement`. Эти утверждения типа удаляются во время компиляции, но они могут оказаться полезными, если вам недостаточно сужения.
Вы можете использовать утверждение типа, чтобы сообщить компилятору TypeScript, что вы знаете тип значения лучше, чем он. Утверждение типа похоже на приведение типа в других языках, но на самом деле оно не меняет тип значения во время выполнения. Вместо этого он сообщает компилятору обработать значение, как если бы оно имело указанный тип.

Вот пример:

```машинопись
пусть значение: строка | число = "привет";
пусть длина: число = (значение в виде строки).длина; // утверждение типа
```

В этом примере «значение» объявлено как тип объединения «строка» и «число». Однако мы знаем, что в данном конкретном случае «значение» — это строка. Мы используем утверждение типа, чтобы сообщить компилятору, что мы хотим обрабатывать `value` как строку, чтобы мы могли получить доступ к его свойству `length`.

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