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
};
try it
Throws the error:
Type 'Enum1' is not assignable to type 'Enum2'.
(property) Type2.a: Enum2
Use the map() method with Enums in TypeScript # To use the map() method with enums: Use the Object. keys() method to get an array of the enum's keys.
The short answer is no, you can't extend enums because TypeScript offers no language feature to extend them.
Using `map()` on JavaScript Enums Since a JavaScript enum is just an object, you can iterate over an object using map() and Object.
You need to cast the type1.a
prop to Enum2
. To do this you need to use a "Type Guard".
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
};
}
try it
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).indexOf(value) > -1;
try it (Doesn't work in www.typescriptlang.org)
More info about Type Guards
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With