Как сопоставить перечисление с другим перечислением в машинописи? - PullRequest
1 голос
/ 27 марта 2019

Я хочу сопоставить свойство одного объекта, имеющего тип enum, со свойством другого объекта, который является другим типом enum.

Я пробовал с type1.a as Enum2 или Enum2[type1.a] безуспешно.

Вот моя упрощенная проблема с кодом:

enum Enum1 {
  N = 0,
  A = 1,
  B = 2
}

enum Enum2 {
  A = 1,
  B = 2
}

interface Type1 {
  a: Enum1;
}

interface Type2 {
  a: Enum2;
}

const type1: Type1 = {
  a: Enum1.A
};

const type2: Type2 = {
  a: type1.a
};

попробуйте

Выдает ошибку:

Type 'Enum1' is not assignable to type 'Enum2'.
(property) Type2.a: Enum2

1 Ответ

0 голосов
/ 27 марта 2019

Вам необходимо разыграть type1.a опору Enum2.Для этого вам нужно использовать «Type Guard».

Вот пример с вашим кодом:

enum Enum1 {
  N = 0,
  A = 1,
  B = 2
}

enum Enum2 {
  A = 1,
  B = 2
}

interface Type1 {
  a: Enum1;
}

interface Type2 {
  a: Enum2;
}

const type1: Type1 = {
  a: Enum1.N
};

function isEnum2(value: any): value is Enum2 {
  let isEnum2 = false;

  for (let key in Enum2) {
    if (Enum2[key] === value) {
      isEnum2 = true;
    }
  }

  return isEnum2;
}

if (isEnum2(type1.a)) {
  const type2: Type2 = {
    a: type1.a
  };
}

попробуйте

Когда функция isEnum2 используется в блоке if, пропеллер type1.a становится типа Enum2 только внутри этого блока if.

Примечание: вы можете заменитьсодержимое в isEnum2 с использованием цикла for..in, если вы используете ES2017 или выше, используя Object.values:

return Object.values(Enum2).indexOf(value) > -1;

попробуйте (неt работает в www.typescriptlang.org)

Более подробная информация о Type Guards

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