如何获取Flow类型检查器涵盖的JSON.parse结果?

fns*_*jdb 7 json flowtype

我刚开始使用flow.我试图在项目中尽可能接近100%的流量覆盖率,而我无法弄清楚的一件事是如何处理JSON.parse.

type ExampleType = {
  thingOne: boolean,
  thingTwo: boolean,
};
const exampleVariable: ExampleType = JSON.parse(
  '{thingOne: true, thingTwo: false}'
);
Run Code Online (Sandbox Code Playgroud)

所以我有一个类型,我从另一个源接收一个字符串,我解析它并期望它是那种类型.

整个JSON.parse(...)部分标记为"未被流程覆盖".

如果JSON.parse在该文件中使用文件,有没有办法让文件达到100%流量覆盖?怎么样?当它说线没有被覆盖时,流量究竟是什么?

Jes*_*ett 4

问题是JSON.parse返回any. 这是签名:

static parse(text: string, reviver?: (key: any, value: any) => any): any;
Run Code Online (Sandbox Code Playgroud)

Flow 无法保证解析结果对类型的分配ExampleType是正确的,因为谁知道解析传入的 JSON 时会产生什么结果?

但如果您使用flow-validator进行解析,则覆盖率可以达到 100%。当解析字符串时,Flow 知道该字符串可能来自任何地方。因此,无法静态保证字符串中的 JSON 数据具有您期望的形状。flow-validator 的作用是提供一个 API 来描述数据的验证模式而不是类型。解析时会在运行时检查架构。Flow-validator 自动从您的模式生成静态类型,并将成功解析的结果分配给该类型。以下是使用 flow-validator 的示例:

import { boolean, object } from "flow-validator"

const ExampleSchema = object({
  thingOne: boolean,
  thingTwo: boolean
})

const exampleVariable = ExampleSchema.parse(
  '{"thingOne": true, "thingTwo": false}'
)
Run Code Online (Sandbox Code Playgroud)

您可以检查并看到 Flow 推断出正确的类型exampleVariable,并且您的 Flow 覆盖率现在为 100%。如果 JSON 数据的形状不正确,则会ExampleSchema.parse抛出错误。

您可以从架构中获取类型,如下所示:

type ExampleType = typeof ExampleSchema.type
Run Code Online (Sandbox Code Playgroud)

此版本ExampleType与您原始示例中的版本一样。自动提取类型可以使您不必为数据结构编写两次形状,并且还可以保证静态类型与运行时验证架构保持同步。