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是值,生成真或假
错。这样的比较如下所示:
o.t==1
可以看作:
typeof o.t == typeof 1 && (...other steps...)
只有该表达式的第一部分将被计算,因为它可以显示为false。Flow知道,在这里,实际上永远不会将数字与字符串进行比较
正如其他人所回答的那样,你应该用Flow代替
=
。我刚刚与另一位回答者进行了相同的讨论。如果您使用的是o.t=='F'
,那么flow会关心类型并抛出错误。我想flow现在不会抛出错误。这有点奇怪,因为与给定字符串类型的数字进行比较似乎没有什么用处。很好。我不知道flow.org/try有悬停提示!