流型中的组合枚举

时间:2018-04-06 19:25:19

标签: javascript enums flowtype

我有一个枚举,它是flowtype中两个其他枚举(所有字符串文字)的组合。

现在我有一个函数f1,只接受部分枚举。基于if子句,我想确保只向这个f1传递正确的参数。

如果我使用if匹配字符串,它就可以了。但是只要我有一个完全相同字符串的变量,它就会出错。

参见代码:

Link to Flow-Playground

为什么f3错误?

/* @flow */
type Enum1 = 'a' | 'b';
type Enum2 = 'c';
type Enum3 = Enum1 | Enum2;

const c = 'c';
// same problem if I use:
// const c: Enum2 = 'c'; 

const f1 = (e1: Enum1) => console.log(e1);

// this works
const f2 = (e3: Enum3) => {
  if (e3 !== 'c') {
    f1(e3);
  }
}

// this breaks - why?
const f3 = (e3: Enum3) => {
  if (e3 !== c) {
    f1(e3);
  }
}

// this works
const f4 = (e3: Enum3) => {
  if (e3 !== c) {
    (e3 === 'c' ? '' : f1(e3))
  }
}

1 个答案:

答案 0 :(得分:2)

类型细化需要使用文字来完成。这也可能与细化失效冲突 - 通过修改var f1的值,对c的调用可能使细化无效。

const f3 = (e3: Enum3) => {
  if (e3 !== 'c') {  // literal c, not var c
    f1(e3);
  }
}

实际上,您在f4中执行相同的操作,因为您要与文字c进行比较,并且仅在f1等同于Enum1时调用std::unordered_map