gpt4 book ai didi

javascript - Flow 无法理解对 null 或未定义的检查

转载 作者:行者123 更新时间:2023-12-01 01:13:26 25 4
gpt4 key购买 nike

现在我正在使用 Apollo Codegen 生成的流类型。这是非常有用的工具,但所有类型都是“可能”的。现在我遇到了下一个问题:请考虑非常精简且简单的示例(链接到 Flow try ):

/* @flow */
type Type1 = {| // <- example of Flow-type generated by Apollo Codegen
prop?: ?string
|}

type Type2 = { // <- example of my Flow-type
prop: string
}

function bar(y: Type2): void {
console.log(y.prop)
}

function foo(x: Type1): void {
if (x && x.prop && typeof x.prop === 'string') { // <- I'm trying to check the "x" argument
bar(x)
}
}

foo({ prop: 'hello' })

Flow 无法理解我的检查,并因 nullundefined 显示错误。如何管理?

最佳答案

这不能作为类型细化起作用的原因是您的检查可以同时通过 Type1Type2。 Flow 执行条件检查,但检查可以通过 Type1 值,因此条件根本不会细化 x 的类型。然后在条件中,它会看到您尝试将 Type1 的值传递给 Type2

要理解 Flow 的类型细化,请务必记住,Flow 不会在该变量的类型之外携带其他变量的细化数据。 Here是一个与您的示例类似的示例,但没有可选字段。在 valid 函数中,我们检查 y.field 的类型,然后在知道其类型后使用 y.field。在invalid函数中,我们检查y.field的类型,然后尝试使用y。但这里类型细化并没有改变 y 的类型,只改变了 y.field 的类型,因此我们得到了类型错误。

作为对比,here是一个我们根据字段值进行类型细化的示例。需要注意的是,在 f 函数内部,变量 z 的类型为 Baz | Qux,并且我们的改进是在这两者之间不重叠的领域上。在这种情况下,细化将类型转变为 Baz | Qux 转换为 Baz 类型,我们可以毫无错误地调用第二个函数。

为了在您的情况下解决此限制,我们需要分解值 x 并将我们正在细化的字段放入其自己的变量中。然后,一旦我们知道了该变量的类型,我们就创建一个类型为 Type2 的值并将其传递到所需的函数中。 Here是最直接的方法。

因为这种事情经常出现,所以我有一种创建“转换”函数的模式,将潜在的不干净的数据转换为干净的数据,这样其他函数就不必担心细化的复杂性。在这种情况下,我会这样做 this .

在清理深层嵌套数据或将嵌套对象从类型 mixed 转换为已知类型时,这种分解转换函数的模式也非常有用。通过组合小类型的转换对象来创建大类型的转换函数比从头开始编写转换函数要容易得多。

关于javascript - Flow 无法理解对 null 或未定义的检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54973159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com