如何从$ Keys获取密钥

时间:2017-10-08 20:42:47

标签: javascript enums flowtype

在JavaScript中没有标准类型的枚举,我转向Flow文档并找到了$ Keys类型,但文档没有描述如何在" enum"中找到特定项目。名单。例如:

const types = {
    T_HANDLE: 1,
    T_COMPUTED: 2,
    T_MATERIAL: 3
};

export type TYPE = $Keys<typeof types>;

class MyClass {
    type: TYPE;

    constructor() {
        this.type = 'T_HANDLE';
    }
}

let myObject = new MyClass();

if(myObject.type === TYPE.T_HANDLE){ //Flow: TYPE. type referenced from value position type TYPE
    // some
}

或者是否有其他方法来实现枚举列表?

2 个答案:

答案 0 :(得分:1)

在您的示例中,TYPE是表示枚举选项的Flow类型。它不会在运行时可用,所以Flow是正确的,以防止你这样使用它。

相反,您可以直接使用枚举键:

if(myObject.type === ('T_HANDLE': TYPE)){
  ..
}

此处,('T_HANDLE': TYPE)部分会检查您是否错误输入了枚举名称。
另请注意,如果您只使用字符串文字作为&#34;枚举&#34;像这样,你根本不需要types容器来获取值。这也可行:

export type TYPE = 'T_HANDLE' | 'T_COMPUTED' | 'T_MATERIAL';

class MyClass {
  type: TYPE;

  constructor() {
      this.type = 'T_HANDLE';
  }
}

let myObject = new MyClass();
if(myObject.type === ('T_HANDLE': TYPE)){
  ..
}

答案 1 :(得分:-1)

我通常会编写自己的Enum类:

class Enum {
    constructor(keys, start = 0) {
        return keys.reduce((obj, k) => ((obj[k] = start++), obj), {});
    }
}

console.log(new Enum(['GET', 'POST', 'DELETE'], 1));

输出:{ GET: 1, POST: 2, DELETE: 3 }