Иногда значение может быть одного из нескольких типов. Это описывают объединением через вертикальную черту:
let id: number | string; id = 42; // ок id = "abc-1"; // тоже ок id = true; // ошибка
Объединения часто встречаются, когда данные приходят в разном виде или поле может отсутствовать:
function format(value: number | null): string { if (value === null) return "нет данных"; return value.toFixed(2); }
Заметьте: внутри ветки if (value === null) TypeScript понимает, что дальше value — точно число, и разрешает вызвать у него числовой метод. Это называют сужением типа (narrowing): по проверкам компилятор уточняет, какой именно тип сейчас.