【发布时间】:2021-01-19 09:30:52
【问题描述】:
我正在尝试检查联合类型的值是否是联合类型之一。
在下面的代码中,前三种方法 (1-3) 似乎不是正确的。
检查特定属性的方法 (4) 似乎有效,但尚不清楚它已改进为哪种类型。
- 在 (4) 中精炼成哪种类型(
A或B)? - 为什么不能将数字或字符串分配给 (5) 和 (6) 中的
a1.a? - 哪一种方法是细化为联合中的一种类型的正确方法,其中该类型不是原始类型(即类型别名)?
type A = {
a: number
}
type B = {
a: string
}
const a1: A | B = {a: 1}
if (typeof(a1) === 'A') {} // (1) Cannot compare the result of `typeof` to string literal `A` because it is not a valid `typeof` return value
if (a1 instanceof A) {} // (2) Cannot reference type `A` [1] from a value position
(a1: A) // (3) Cannot cast `a1` to `A` because string [1] is incompatible with `A` [2]
if (a1.a) { // (4) Works, but inconclusive?
a1.a = 2 // (5) Cannot assign `2` to `a1.a` because number [1] is incompatible with string [2]
a1.a = '2' // (6) Cannot assign `'2'` to `a1.a` because string [1] is incompatible with number [2]
}
【问题讨论】:
-
(4) 不起作用,
0和""都是假的,1和"x"都是真的。 -
我本来希望
typeof a1.a === "number"可以工作(真 =A,假 =B),它在 TypeScript 中可以工作,但 Flow doesn't seem to like it... :-|跨度> -
@T.J.Crowder 很抱歉,我没有意识到
0和""是假的,1和"x"是真的。你能写出虚假和真实的陈述吗?谢谢 -
(4) 是
if (a1.a),但这并不能告诉您a1是A还是B,因为它对于@987654342 都是错误的@(数字)和""(字符串),1(数字)和"1"(字符串)都是如此。也就是说,0和""都是 falsy 值(在条件中使用时强制转换为false的值)。完整的虚假值集是:0、""、NaN、null、undefined,当然还有false(在浏览器上也有document.all...原因)。所有其他值都是truthy。 -
或许这篇文章能帮上忙:stackoverflow.com/questions/51528780/…
标签: javascript functional-programming flowtype