gpt4 book ai didi

flowtype - Flow 无法识别回调内部的细化

转载 作者:行者123 更新时间:2023-12-04 23:41:25 29 4
gpt4 key购买 nike

此代码通过了流程检查:

/* @flow */

function test (list: ?Array<string>): Promise<number> {
if(list !== null && list !== undefined) {
return Promise.resolve(list.length)
} else {
return Promise.resolve(0)
}
}

console.log(test(null))

而以下得到空检查错误
/* @flow */

function test (list: ?Array<string>): Promise<number> {
if(list !== null && list !== undefined) {
return Promise.resolve().then(() => list.length)
} else {
return Promise.resolve(0)
}
}

console.log(test(null))

错误:
property `length`. Property cannot be accessed on possibly null value

明确列表不能是 null所以一定有一些关于代码结构的东西使流无法识别这一点。

我想了解我遇到了什么限制以及我如何解决它。谢谢!

最佳答案

基本上,Flow 不知道您的类型细化(空检查)会在 () => list.length 时成立。被执行。在该回调 Flow 中,仅查看列表的类型——表示它可以为空。

第一个和第二个片段之间的区别在于第二个片段 list跨越了一个函数边界——你在一个不同的函数中使用它而不是你改进它的类型。

一种解决方案是将 list.length 提取到一个变量中,并在回调中使用该变量。

var length = list.length;
return Promise.resolve().then(() => length)

这也可能有效:
var list2: Array<string> = list;
return Promise.resolve().then(() => list2.length)

请注意,即使对于立即调用的回调也存在此问题,例如使用时 mapforEach . flow 的 github 上有这个问题,但是我快速搜索后找不到。

关于flowtype - Flow 无法识别回调内部的细化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36500041/

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