我刚开始使用flow。我试图在项目中尽可能接近100%的流量覆盖率,而我无法弄清楚的一件事是如何处理JSON.parse
。
type ExampleType = {
thingOne: boolean,
thingTwo: boolean,
};
const exampleVariable: ExampleType = JSON.parse(
'{thingOne: true, thingTwo: false}'
);
所以我有一个类型,我从另一个源接收一个字符串,我解析它并期望它是那种类型。
整个JSON.parse(...)
部分标记为“未被流量覆盖”。
如果在该文件中使用JSON.parse
,有没有办法让文件达到100%流量覆盖率?怎么样?当它说线不被覆盖时,流量到底是什么意思?
答案 0 :(得分:2)
问题是JSON.parse
返回any
。这是签名:
static parse(text: string, reviver?: (key: any, value: any) => any): any;
Flow不能保证将解析结果分配给类型ExampleType
是正确的,因为谁知道在解析传入的JSON时会发生什么?
但是,如果您使用flow-validator进行解析,则可以将覆盖率提高到100%。据Flow所知,在解析字符串时,该字符串可能来自任何地方。因此,不能静态保证字符串中的JSON数据具有您期望的形状。什么流程验证器会执行此操作以提供用于描述数据而非类型的验证模式的API。解析时在运行时检查架构。 Flow-validator会根据您的模式自动生成静态类型,并将成功解析后的结果分配给该类型。这是使用流验证器的示例:
import { boolean, object } from "flow-validator"
const ExampleSchema = object({
thingOne: boolean,
thingTwo: boolean
})
const exampleVariable = ExampleSchema.parse(
'{"thingOne": true, "thingTwo": false}'
)
您可以检查并确认Flow推断出exampleVariable
的正确类型,并且Flow覆盖率现在为100%。如果JSON数据的形状不正确,则ExampleSchema.parse
将引发错误。
您可以从这样的模式中获取类型:
type ExampleType = typeof ExampleSchema.type
此版本的ExampleType
与原始示例中的版本相同。提取类型会自动使您不必为数据结构编写两次形状,而且还可以确保静态类型与运行时验证架构保持同步。