【问题标题】:How to check if an object is an instance of a Flow type?如何检查对象是否是 Flow 类型的实例?
【发布时间】:2019-08-09 08:31:02
【问题描述】:

我设置了两种流类型:

type Form1Fields = {
    fieldA
}

type Form2Fields = {
    fieldZ
}

type FormFields = Form1Fields | Form2Fields

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

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

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

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

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

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

我可以使用 number 之类的原始类型来做到这一点,但我似乎无法使用 Flow 类型来做到这一点。

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

【问题讨论】:

  • 我不确定 flowtype 如何在后台表示类型。你试过if (fields instanceof Form1Fields) {吗? typeof 只会给你object

标签: javascript flowtype


【解决方案1】:

啊,答案是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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2017-12-06
    • 2013-01-14
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多