如何检查一个对象是否是Flow类型的实例?

4

我有两种 Flow 类型设置:

type Form1Fields = {
    fieldA
}

type Form2Fields = {
    fieldZ
}

type FormFields = Form1Fields | Form2Fields

然后我编写一个接受FormFields对象作为参数的函数:

const myFunction = (fields: FormFields) => return fields.fieldA;

这给我带来了错误:因为Form2Fields上缺少property fieldA, 无法获取fields.fieldA
我理解这个错误的含义。根据Flow文档所述,"当调用接受联合类型的函数时,我们必须传入其中一个类型。但在函数内部,我们必须处理所有可能的类型。"
所以在myFunction中,我需要做类似以下的操作:
if (typeof fields === Form1Fields) { ... }
else { ... }

我可以用原始类型比如number做到这一点,但是似乎我不能用Flow类型来做到这一点。

有没有一种比较对象和Flow类型的方法,或者有没有其他解决这个问题的方式?


我不确定flowtype在底层如何表示类型。你尝试过 if (fields instanceof Form1Fields) { 吗?typeof 只会给你 object - Halcyon
1个回答

5
啊,答案是“不相交的联合”。通过向一个类型添加一个“标识”该类型的字段,在myFunction中可以进行检查。
type Form1Fields = {
    type: 'Form1Fields',
    fieldA: string
}

type Form2Fields = {
    type: 'Form2Fields',
    fieldZ: string
}

type FormFields = Form1Fields | Form2Fields

const myFunction = (fields: FormFields) => return fields.type === 'Form1Fields' ? fields.fieldA : fields.fieldZ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接