Functional programming 在不验证属性的情况下测试联合变量的类型

Functional programming 在不验证属性的情况下测试联合变量的类型,functional-programming,flowtype,Functional Programming,Flowtype,我试图检查union类型的变量的值的类型 /*@flow*/ A型={ a:号码, b:号码 } B类={ c:字符串 } 常数fun1:(A | B)=>void=(x)=>{ 如果(x.a){ x、 a x、 b/不起作用 } 如果(x.b){ x、 b x、 a/不起作用 } 如果(x.c){ x、 c } } 唯一的方法是检查单个属性吗?在上面的例子中,我们知道如果x.a,那么也x.b。是否没有办法检查a类型或B类型以便我可以编写 const fun1:(A | B)=>void=(x

我试图检查union类型的变量的值的类型

/*@flow*/
A型={
a:号码,
b:号码
}
B类={
c:字符串
}
常数fun1:(A | B)=>void=(x)=>{
如果(x.a){
x、 a
x、 b/不起作用
}
如果(x.b){
x、 b
x、 a/不起作用
}
如果(x.c){
x、 c
}
}
唯一的方法是检查单个属性吗?在上面的例子中,我们知道如果
x.a
,那么也
x.b
。是否没有办法检查
a
类型或
B
类型以便我可以编写

const fun1:(A | B)=>void=(x)=>{
if(typeof x=='A'){//无法将'typeof'的结果与字符串文字'A'进行比较,因为它不是有效的'typeof'返回值。
x、 a/有效
x、 b/工作
}
}

您的代码失败,因为默认情况下,流对象类型允许未指定的属性,因此,例如,可以使用以下选项:

let a: A = {
  a: 1,
  b: 2,
  c: "",
};
因此,根据您当前的定义,
A
类型也可以称为
B
类型

为了避免这种情况,您需要设置
A
B
,以便Flow知道它们不允许额外的随机属性。e、 g

type A = {|
  a: number, 
  b: number
|}

type B = {|
  c: string
|}