2017-10-08 131 views
0

在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 
} 

或者还有另一种方法来实现枚举列表?

回答

1

在你的榜样,TYPE是代表你的枚举选项的流量类型。它在运行时不可用,所以Flow是正确的,可以防止你像这样使用它。

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

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

在这里,你没有输入了错误的枚举名('T_HANDLE': TYPE)部分检查。
另请注意,如果您只使用字符串文字作为“enums”,您实际上并不需要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

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

+0

鉴于问题是关于FlowType,这似乎不回答这个问题? – loganfsmyth

+0

@loganfsmyth的确如此。 – Rafael