Я использую перечисление для достижения номинальной типизации (как, например, предложено в TypeScript Deep Dive книга):
enum ExampleIdBrand {}
export type ExampleId = ExampleIdBrand & string
const exampleId: ExampleId = '42' as ExampleId
const m1 = (e: ExampleId) => e.toUpperCase()
m1(exampleId) // ✅
Пока все работает так, как и ожидалось. Однако, если я изменю метод, чтобы принять (более широкий) тип объединения, компилятор больше не принимает мой exampleId
:
const m2 = (e: ExampleId | 'whatever') => e.toUpperCase()
m2('whatever') // ✅
m2(exampleId) // ???? Does not compile
Почему последняя строка не компилируется? (ТУ 3.3.4000)
const exampleId: ExampleId = '42' as ExampleId;
уже запах. Если мы удалим приведение и сделаем ExampleId строкойexport type ExampleId = string;
, это сработает. Кажется, что невозможно создать типы пересечения ~~union~~ с перечислениями. Немного погуглю... - person Daniel Dietrich   schedule 05.04.2019