Javascript 流联合类型未出错

Javascript 流联合类型未出错,javascript,typescript,flowtype,union-types,Javascript,Typescript,Flowtype,Union Types,因此,我有以下代码: type Something = | { t: 'A', src: string } | { t: 'B', src: string } | { t: 'C', src: number }; const f = (o: Something): string => o.t === 1 ? o.src : 'a-string'; 当o.t为1时,我希望返回o.src时会看到一个错误,因为我从未定义t可以是一个数字。因此,如果t是数字

因此,我有以下代码:

type Something =
  | { t: 'A', src: string }
  | { t: 'B', src: string }
  | { t: 'C', src: number };

const f = (o: Something): string => 
  o.t === 1
    ? o.src 
    : 'a-string';
o.t
为1时,我希望返回
o.src
时会看到一个错误,因为我从未定义
t
可以是一个数字。因此,如果
t
是数字,则flow不知道
o.src
的类型是什么。但是它没有任何错误。我错过了什么

这是你的电话号码

对于记录,正确地抛出错误。虽然错误消息不是很有用

更清楚一点,如果我使用
o.t==“F”
,那么flow将很高兴地抛出以下错误:

9:o.t==='F'^所有分支都不兼容:属性为
t
且与字符串文字
F
匹配的对象与字符串文字
A
不兼容。或者具有与字符串文字
F
匹配的属性
t
的对象与字符串文字
B
[3]不兼容。或者属性为
t
且与字符串文字
F
匹配的对象与字符串文字
C
[4]不兼容。 参考资料: 9:o.t=='F'^ 4:|{t:'A',src:string} ^ 5:|{t:'B',src:string} ^ [3] 6:{t:'C',src:number}; ^[4]


我不知道为什么,但这只是不一致的行为,如果我使用的值未在类型中定义,我希望看到一些错误。你知道,就像一段无法到达的代码。

如果你在
处检查
o.src
的类型?o、 src
,您将看到它有一个“空”类型。这意味着流理解没有有效的输入集会导致执行此代码。流不会抛出错误,但它确实理解这种情况是不可能的,因此只能返回字符串

请参阅Peter Hall的答案,了解flow为什么这样做。似乎主要原因是您使用了
==
操作符。相等的第一步似乎是检查两个项目的类型是否相同。如果它们不相同,则流标记分支为空。似乎使用
==
捕捉这些东西可能会更好(只要打开了不安全强制警告)


旁注:如果您使用Flow.com/try,可以将鼠标悬停在表达式上以显示类型。

Flow通常希望您使用
==
,因为它可以告诉您不安全的强制。如果您使用
==
编写此示例,您将得到预期的错误(好的,4个错误):

const f = (o: Something): string => 
  o.t == 1
    ? o.src 
    : 'a-string';

这取决于
==
的语义。根据,运算符的定义如下(至少是重要位):

比较x===y,其中x和y是值,生成真或假 错。这样的比较如下所示:

  • 如果类型(x)与类型(y)不同,则返回false
  • …其他步骤
  • 实际上,您不必查看步骤1。您的表达式
    o.t==1
    可以看作:

    typeof o.t == typeof 1 && (...other steps...)
    
    只有该表达式的第一部分将被计算,因为它可以显示为false。Flow知道,在这里,实际上永远不会将数字与字符串进行比较


    正如其他人所回答的那样,你应该用Flow代替
    =

    我刚刚与另一位回答者进行了相同的讨论。如果您使用的是
    o.t=='F'
    ,那么flow会关心类型并抛出错误。我想flow现在不会抛出错误。这有点奇怪,因为与给定字符串类型的数字进行比较似乎没有什么用处。很好。我不知道flow.org/try有悬停提示!