Reputation: 123
I want to map one object's property that has an enum type to another object's property that is other enum type.
I've tried with type1.a as Enum2
or Enum2[type1.a]
with no success.
Here is my simplified code problem:
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
};
Throws the error:
Type 'Enum1' is not assignable to type 'Enum2'.
(property) Type2.a: Enum2
Upvotes: 11
Views: 19547
Reputation: 1053
You need to cast the type1.a
prop to Enum2
. To do this you need to use a "Type Predicate".
Here is an example with your code:
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
};
}
When the isEnum2
function is used in the if
block the prop type1.a
becomes of type Enum2
inside that if
block only.
Note: you could replace the content in the isEnum2
using for..in
loop if you are using ES2017 or higher using Object.values
:
return Object.values(Enum2).includes(value);
More info about Type Predicates
Upvotes: 7