Почему нужно перечислить значение перечисления до того, как тип объекта будет правильно распознан? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть объект, который различается по свойству type, которое может быть любым значением данного перечисления.Когда я создаю действительный объект и затем передаю его в функцию, машинописный текст жалуется, что типы не совпадают.Однако, если я приведу значение enum, то все в порядке.

enum AorB {
  A = 'a',
  B = 'b',
};

type Bar_A = {
  type: AorB.A;
};

type Bar_B = {
  type: AorB.B;
}

type Bar = Bar_A | Bar_B;

function foo(a: Bar): void {}

const arg = {
  type: AorB.A,
};

// this would work but is extra writing
// const arg = {
//   type: AorB.A as AorB.A
// };

foo(arg); // Error
foo({
  type: AorB.A,
})

См. Эквивалентную ссылку на игровую площадку

1 Ответ

2 голосов
/ 01 апреля 2019

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, чтобы заставить компилятор хранить литеральные типы без необходимости повторного указания типа, хотя это сделает весь объект доступным только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...