【问题标题】:How to get key from $Keys如何从 $Keys 获取密钥
【发布时间】:2017-10-08 20:42:46
【问题描述】:

在 JavaScript 中没有标准类型的枚举,我翻到 Flow 文档并找到 $Keys 类型,但文档没有描述如何获取“枚举”列表中的特定项目。例如:

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
}

或者还有其他方法可以实现枚举列表吗?

【问题讨论】:

    标签: javascript enums flowtype


    【解决方案1】:

    在您的示例中,TYPE 是代表您的枚举选项的 Flow 类型。它在运行时不可用,因此 Flow 阻止您这样使用它是正确的。

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

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

    这里,('T_HANDLE': TYPE) 部分检查您没有输入错误的枚举名称。
    另请注意,如果您只将字符串文字用作这样的“枚举”,那么您实际上根本不需要 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)){
      ..
    }
    

    【讨论】:

      【解决方案2】:

      我通常像这样编写自己的 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 }

      【讨论】:

      • 鉴于问题是关于 Flowtype 的,这似乎无法回答问题?
      • @loganfsmyth 确实。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多