[流程]多种类型检查

时间:2017-05-06 12:23:07

标签: javascript flowtype flow-typed

我使用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']
}

1 个答案:

答案 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

解决方案

这里的主要问题是test2aaa可以bodybbb类型的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。这样可以消除错误。