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

时间:2019-08-09 00:18:28

标签: javascript flowtype

我设置了两种流类型:

type Form1Fields = {
    fieldA
}

type Form2Fields = {
    fieldZ
}

type FormFields = Form1Fields | Form2Fields

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

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

这给了我错误Cannot get fields.fieldA because property fieldA is missing on Form2Fields

我明白了。根据{{​​3}},“在调用接受联合类型的函数时,我们必须传递这些类型中的一种。但是在函数内部,我们必须处理所有可能的类型 。”

所以在myFunction中,我需要做类似的事情:

if (typeof fields === Form1Fields) { ... }
else { ... }

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

有没有一种方法可以将对象与Flow类型进行比较,或者有其他方法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

啊,答案是Disjoint Unions。通过向“标识”该类型的类型添加字段,我可以在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;