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

jac*_*les 4 javascript flowtype

我设置了两种流类型:

type Form1Fields = {
    fieldA
}

type Form2Fields = {
    fieldZ
}

type FormFields = Form1Fields | Form2Fields
Run Code Online (Sandbox Code Playgroud)

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

const myFunction = (fields: FormFields) => return fields.fieldA;
Run Code Online (Sandbox Code Playgroud)

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

我明白它在说什么。根据Flow 文档,“在调用接受联合类型的函数时,我们必须传入其中一种类型。但在我们的函数内部,我们需要处理所有可能的类型。”

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

if (typeof fields === Form1Fields) { ... }
else { ... }
Run Code Online (Sandbox Code Playgroud)

我可以用像 那样的原始类型做到这一点number,但似乎我不能用 Flow 类型做到这一点。

有没有办法将对象与 Flow 类型进行比较,或者是否有不同的方法来解决这个问题?

jac*_*les 5

啊,答案是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;
Run Code Online (Sandbox Code Playgroud)