【问题标题】:Combined Enum in Flow Type流类型中的组合枚举
【发布时间】:2018-04-06 19:25:18
【问题描述】:

我有一个枚举,它是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))
  }
}

【问题讨论】:

    标签: javascript enums flowtype


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以你的更改是f2,在我上面的列表中。但我明白你关于无效的观点,我从来没有那样想过。我也尝试将c 输入为Enum2,但仍然是同样的问题。但我有点理解为什么会这样。
    • 你知道吗,这是官方文档中的某个地方吗?感谢您的回答,将尽快投票并接受
    • flow.org/en/docs/lang/refinements - 这并没有谈论对文字进行的比较,但您需要记住 Flow 进行静态类型验证,而不是在运行时,所以您放入变量的是没有被普遍跟踪,因为它不能。这就是记录细化失效的原因,任何可能在运行时产生副作用的东西都可能使流对什么是有效的想法无效。
    • 还值得一提的是,要使细化工作,必须使用身份运算符===;当使用相等/等价运算符 == 时,Flow 不会“接受”改进(如果我不得不猜测的话,因为强制)。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2021-09-17
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多