我刚开始使用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%流量覆盖?怎么样?当它说线没有被覆盖时,流量究竟是什么?
问题是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与您原始示例中的版本一样。自动提取类型可以使您不必为数据结构编写两次形状,并且还可以保证静态类型与运行时验证架构保持同步。
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |