Javascript 流类型中的组合枚举

Javascript 流类型中的组合枚举,javascript,enums,flowtype,Javascript,Enums,Flowtype,我有一个枚举,它是flowtype中另外两个枚举(所有字符串文本)的组合 现在我有了一个函数f1,它只接受枚举的一部分。基于if子句,我希望确保只向该f1传递正确的参数 如果我使用If对字符串进行匹配,它会起作用。但只要我有一个字符串完全相同的变量,它就会出错 见代码: 为什么f3会出错 /*@flow*/ 类型Enum1='a'|'b'; 类型Enum2='c'; 类型Enum3=Enum1 | Enum2; 常数c='c'; //同样的问题,如果我使用: //常数c:Enum2='c';

我有一个枚举,它是
flowtype
中另外两个枚举(所有字符串文本)的组合

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

如果我使用
If
对字符串进行匹配,它会起作用。但只要我有一个字符串完全相同的变量,它就会出错

见代码:

为什么f3会出错

/*@flow*/
类型Enum1='a'|'b';
类型Enum2='c';
类型Enum3=Enum1 | Enum2;
常数c='c';
//同样的问题,如果我使用:
//常数c:Enum2='c';
常量f1=(e1:Enum1)=>console.log(e1);
//这很有效
常数f2=(e3:Enum3)=>{
如果(e3!=='c'){
f1(e3);
}
}
//这打破了-为什么?
常数f3=(e3:Enum3)=>{
如果(e3!==c){
f1(e3);
}
}
//这很有效
常数f4=(e3:Enum3)=>{
如果(e3!==c){
(e3=='c'?'':f1(e3))
}

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

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

实际上,您在
f4
中也在做同样的事情,因为您正在与literal
c
进行比较,并且只调用
f1
,如果它相当于
Enum1

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

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

实际上,您在
f4
中也在做同样的事情,因为您正在与literal
c
进行比较,并且只调用
f1
,如果它等效于
Enum1

,那么您的更改就是我上面列表中的
f2
。但我明白你关于无效的观点,我从来没有这样想过。我也尝试将
c
键入
Enum2
,但仍然是相同的问题。但我知道为什么会这样。你知道吗,这是官方文件中的某个地方吗?感谢您的回答,will upvote并很快接受-这并不是说要对文本进行比较,但您需要记住,流进行静态类型验证,而不是在运行时,因此您在变量中放入的内容不会被普遍跟踪,因为它不能。这就是为什么细化失效会被记录在案,任何在运行时可能产生副作用的东西都可能使流关于什么是有效的想法失效。同样值得一提的是,要使细化工作正常,必须使用标识操作符
==
;当使用相等/等价运算符时,Flow不会“接受”细化(因为强制,如果我不得不猜测的话)。因此,在我上面的列表中,您的更改是
f2
。但我明白你关于无效的观点,我从来没有这样想过。我也尝试将
c
键入
Enum2
,但仍然是相同的问题。但我知道为什么会这样。你知道吗,这是官方文件中的某个地方吗?感谢您的回答,will upvote并很快接受-这并不是说要对文本进行比较,但您需要记住,流进行静态类型验证,而不是在运行时,因此您在变量中放入的内容不会被普遍跟踪,因为它不能。这就是为什么细化失效会被记录在案,任何在运行时可能产生副作用的东西都可能使流关于什么是有效的想法失效。同样值得一提的是,要使细化工作正常,必须使用标识操作符
==
;当使用相等/等价运算符
==
时,流不会“接受”细化(如果我不得不猜测的话,是因为强制)。