我使用flowType来编写快速路由器代码,并让流检查req.body数据,正文数据有多种类型,如UserData(bbb类型)或LoginData(ccc类型)。但是当身体将数据转换为函数时,流总是说错了。是否有任何好主意支持身体有多种类型检查?这是一个演示错误的代码。
/* @flow */
declare type ccc = {
ccc: string;
}
declare type bbb = {
bbb: string;
}
declare type aaa = {
body: bbb | ccc
}
function test(aaa: aaa) {
const body = aaa.body
test2(body)
}
function test2(body: ccc): string {
return body['ccc']
}
答案 0 :(得分:0)
以下是使用flow
运行提供的代码时出现的错误:
34: test2(body)
^^^^^^^^^^^ function call
37: function test2(body: ccc): string {
^^^ property `ccc`. Property not found in
34: test2(body)
^^^^ object type
这里的主要问题是test2
。 aaa
可以body
或bbb
类型的ccc
值,这意味着当您致电
const body = aaa.body
test2(body)
body
可以匹配bbb
类型,也可以匹配ccc
类型,我们不知道。同时,test2
显式只接受ccc
类型的参数。 Flow正在看到传递bbb
类型的可能性,当然,它不具有ccc
属性。至少有一种解决方案是进行以下更改:
function test2(body: bbb | ccc): string {
if (typeof body.ccc === 'string') {
return body.ccc
}
return ''
}
我们需要bbb | ccc
因为它实际上可以是任一选项。接下来,我们需要进行typeof
检查,以确保在我们传入undefined
类型的情况下我们不会返回bbb
。这样可以消除错误。