typescript - 如何将一个枚举映射到打字稿中的另一个枚举?
问题描述
我想将一个对象的具有枚举类型的属性映射到另一个对象的其他枚举类型的属性。
我尝试过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
解决方案
您需要将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
注意:如果您使用的是 ES2017 或更高版本,则可以使用以下方法替换isEnum2
using循环中的内容:for..in
Object.values
return Object.values(Enum2).indexOf(value) > -1;
试试看(在 www.typescriptlang.org 中不起作用)
推荐阅读
- reactjs - 反应 UI 不更新
- c# - 什么定义了 SVCUTIL 生成的 C# 代理类的运行时版本?
- ruby-on-rails - 无法使用 rails 更新编辑表单中的字段
- php - DataTables关于调整大小的响应问题
- python - 使用 python cv2 捕获外部 USB 网络摄像头的视频(在 Windows 上)
- racket - 获取列表列表的第二个元素作为列表列表
- javascript - AJAX 页面重定向正确。但是由于重定向传递的数据要刷新
- python-3.x - 3d 数组的 Numpy 乘法
- python - 使用每个元素 x 次将 python 数组映射到 x 倍长的数组
- nativescript - 在 Android 中发布构建问题 - Nativescript+ Angular