假设我在Flow中定义了两种类型:
type A = {
x : string;
};
type B = {
y : string;
};
现在我有一个这样的函数f
:
const f = (o : A | B) : string => {
if (o isa A) { // Not real code
return o.x;
}
return o.y;
};
如何实施o isa A
?
我想创建一个表达式,在运行时根据Flow类型定义检查对象。
编译后的代码可能如下所示:
const f = o => {
if (typeof(o.x) !== 'undefined') {
return o.x;
}
return o.y;
};
答案 0 :(得分:2)
这里有两个主要问题。
B
类型的对象也不具备x
属性,就像A
一样,反之亦然。首先,要明确的是,您现有的定义适用于
var o: B = {
x: 45,
y: "string",
};
因为{ y: string }
表示" y
是string
"的对象,而不是"只有的对象一个y
string
。"
要获得您期望的行为,您需要使用Flow Exact Object Syntax作为
type A = {|
x : string;
|};
type B = {|
y : string;
|};
现在到第二点,最简单的方法是
const f = (o : A | B) : string => {
if (typeof o.x !== "undefined") {
return o.x;
}
if (typeof o.y !== "undefined") {
return o.y;
}
throw new Error("Unreachable code path");
};
向Flow明确指出属性存在的两种情况是唯一可以返回字符串的两种情况。