如何在接口中设置枚举值?

时间:2018-07-25 11:56:53

标签: typescript

我正在尝试使用enum作为接口描述中的值。 TypeScript可以理解键入内容,但是无法检查对象:

enum Type {
  A = 'a',
  B = 'b',
  C = 'C'
}

interface ABC {
  type: Type
}

interface A extends ABC {
  type: Type.A
}

const a: A = { type: 'a' }
// Type '{ type: "a"; }' is not assignable to type 'A'.
//   Types of property 'type' are incompatible.
//     Type '"a"' is not assignable to type 'Type.A'.

尽管,当我直接设置枚举const a : A = { type: Type.A }或使用字符串作为值时,它会按预期工作:

interface A {
  type: 'a'
}

const a: A = { type: 'a' }

1 个答案:

答案 0 :(得分:2)

这是预期的和预期的行为。有关讨论,请参见this ticket。其要点是,您不应尝试对枚举值进行硬编码,因为枚举值是专门设计用来隐藏基础常量的。

在不需要分配字符串文字但可以使用枚举的情况下,执行此操作的正确方法是:

   enum Type {
      A = 'a',
        B = 'b',
          C = 'C'
   }

   interface ABC {
         type: Type
   }

   interface A extends ABC {
         type: Type.A
   }

   const a: A = { type: Type.A }

总是有使用类型转换let a: A = {type: "a" as Type.A};的选项,但是如果这样做,将不会获得类型安全性。我会坚持第一种模式,如果您有任何用户提供的值,则由于类型检查仅是编译时,因此无论如何都需要检查该值(我是否会验证它是否确实是'a')。

let a: A;
if (userValue === Type.A) {
      a = { type: userValue };
}