【问题标题】:How can I get JSON.parse result covered by the Flow type checker?如何获得流类型检查器涵盖的 JSON.parse 结果?
【发布时间】:2023-04-07 04:32:01
【问题描述】:

我不熟悉使用流程。我试图在一个项目中获得尽可能接近 100% 的流量覆盖率,而我不知道如何处理的一件事是 JSON.parse

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

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

整个JSON.parse(...) 部分被标记为“未被流量覆盖”。

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

【问题讨论】:

  • 它无法判断你的分配是否真的有效。
  • 静态(!)代码检查工具无法检查运行时发生的任何事情。 JSON.parse 的结果是mixed,因为它不能静态确定。
  • 所以没有办法在带有JSON.parse 的文件中获得100% 的覆盖率,因为流无法知道被解析的字符串是否会导致正确的类型?
  • 是的,您必须为 RUNTIME 检查添加代码,Flow 会将其识别为类型细化。 flow.org/en/docs/lang/refinements
  • 无论如何 - “100% 覆盖率”就像“100% 完美”,任何人即使尝试为任何不平凡的事情 也不了解宇宙是如何运作的。当你到达那里(达到 100% 完美)时,宇宙的其他部分已经死了。玩一些《星际争霸 II》,从你身上获得“完美”的想法(有利于实际完成工作)。

标签: json flowtype


【解决方案1】:

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

static parse(text: string, reviver?: (key: any, value: any) => any): any;

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}'
)

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

您可以像这样从架构中获取类型:

type ExampleType = typeof ExampleSchema.type

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2019-12-19
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多