首页 > 解决方案 > 如何将一个枚举映射到打字稿中的另一个枚举?

问题描述

我想将一个对象的具有枚举类型的属性映射到另一个对象的其他枚举类型的属性。

我尝试过type1.a as Enum2Enum2[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

标签: typescriptenumscasting

解决方案


您需要将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成为类型。Enum2if

注意:如果您使用的是 ES2017 或更高版本,则可以使用以下方法替换isEnum2using循环中的内容:for..inObject.values

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

试试看(在 www.typescriptlang.org 中不起作用)

有关类型守卫的更多信息


推荐阅读