javascript - 流类型中的组合枚举

标签 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))
  }
}

最佳答案

需要使用文字来进行类型细化。这也可能与细化失效发生冲突 - 对 f1 的调用可能会通过修改 var c 的值来使细化失效。

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

实际上,您在 f4 中做了同样的事情,因为您正在与文字 c 进行比较,并且仅在其满足条件时才调用 f1相当于Enum1

关于javascript - 流类型中的组合枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699761/

相关文章:

javascript - React 嵌入脚本标签是不可设置样式的

javascript - 重叠 Div 并简化 jquery 代码

objective-c - 使用typedef枚举时,返回类型枚举EnumName返回枚举成员时会产生编译器错误

javascript - 流式返回函数时不保留泛型函数参数

javascript - 不同时区的倒计时器

python - 如何取回枚举元素的名称?

c# - 使用带有 NHibernate 的枚举将 varchar 值 xxxx 转换为 int 时转换失败

javascript - 流类型检查 : undefined is not a function even if there is a conditional

javascript - 流类型检查问题

javascript - 通过 captureBase64 截图后 CasperJS 无法正确显示字符