我想将一个具有枚举类型的对象的属性映射到另一个具有其他枚举类型的对象的属性。
我尝试过type1.a as Enum2
or 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
};
try it
抛出错误:
Type 'Enum1' is not assignable to type 'Enum2'.
(property) Type2.a: Enum2
你需要投射type1.a
支持Enum2
。为此,您需要使用“类型谓词”。
这是您的代码的示例:
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
当。。。的时候isEnum2
函数用于if
阻止道具type1.a
成为类型Enum2
里面if
仅阻止。
Note:您可以替换中的内容isEnum2
using for..in
如果您使用的是 ES2017 或更高版本,则循环使用Object.values:
return Object.values(Enum2).includes(value);
try it
有关类型谓词的更多信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)