Typescript будет расширять литеральные типы, если только у него нет причины их хранить, поэтому arg
будет напечатано как {type: AorB }
, а не { type: AorB.A, }
.
Если вы явно используете утверждение типа AorB.A as AorB.A
, тогда машинопись будет сохранять литеральный тип. Если вы назначите литерал объекта в местоположение, которое требует Bar
(например, параметр для функции), машинопись снова сохранит литеральный тип.
Другой вариант, который будет работать, - это ввести arg
явно:
const arg: Bar = {
type: AorB.A,
};
foo(arg);
foo({
type: AorB.A,
})
Или используйте as const
в 3.4, чтобы заставить компилятор хранить литеральные типы без необходимости повторного указания типа, хотя это сделает весь объект доступным только для чтения.