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 类型进行比较,或者是否有不同的方法来解决这个问题?
啊,答案是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)
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |