2

作为一名习惯于严格类型语言的嵌入式软件工程师,在用 JavaScript 编写实验性实用程序时,我不得不使用 Flow ( https://flow.org )。

用 JS+Flow 编写代码大约 10 分钟后,Flow('flow-bin' 二进制文件)给了我以下错误:

无法调用 string.trim().replaceAll,因为字符串 [1] 中缺少属性 replaceAll(您的意思是替换吗?)。

关于以下(流注释)代码:

static sanitizeString(string : string) : string {
    return string.trim().replaceAll(/(?:\s+|\.+)/g, "");
}

Flow 告诉我它在(似乎是一个)“符号”定义文件中找不到(相当广泛实现的)string.prototype.replaceAll(...)函数: tmp/flow/flowlib_1fa18dde633e97c7_501/core.js

这引出了一个问题:

在使用由 ECMAScript 标准定义的(广泛实施的)方法时, Flow 用户是否完全受预置定义文件的支配(或者考虑到浏览器实施 ECMAScript 的快节奏性质,或就此提出的提案/草案)?

我是否必须修改定义文件 (core.js) 才能解决此问题?

4

2 回答 2

2

首先,我没有直接回答这个问题,但我会尝试详细说明这个问题。

但这是相当有趣的。它确实引发了该错误:Flow Example

现在,它变得更有趣了,因为 TypeScript 抛出了同样的错误:TS Example

但是,TS 在错误消息中更加健壮:

“字符串”类型不存在属性“replaceAll”。您需要更改目标库吗?尝试将lib编译器选项更改为“esnext”或更高版本。

因此,我建议您遵循该建议并切换流编译器以遵循不同的规则集(我猜是在.flowconfig中?)。

于 2020-12-18T15:20:57.817 回答
1

我认为我们需要努力将这个问题与上下文联系起来,然后才能真正考虑回答。

Flow提供了一组基本类型作为大多数用例的良好起点。这些会定期更新,但并不是真正有条理的过程的一部分。用户经常打开 PR 以使用他们感兴趣的部分来更新提供的 libdef,这可能是这些更新现在最常见的方式。对核心类型的更改通常非常简单,并且是很好的“第一个 PR”。还值得注意的是,flow 的传入 PR 比 typescript 少得多。

因此,实际情况最终是流提供的类型并不总是与最新规范的每一条都是最新的。问题变成了,人们如何应对这种情况?

一种选择是停止使用提供的类型。Flow 有一个配置选项:

no_flowlib (布尔值)

Flow 具有内置的库定义。将此设置为true将告诉 Flow 忽略内置库定义。

默认值为false

通过将此设置为true我们将不再获得任何流提供的类型。这允许我们只使用我们指定的类型。一种常见的做法是将其切换为true,将流提供的类型复制到项目的本地 libdef 中,并就地对其进行修改。这将使我们能够获得使用提供的类型的所有好处,同时还能够进行任何必要的修改。主要缺点是现在每次升级流程版本时都必须手动更新类型。

当然,另一种选择是只打开一个 PR。Flow 发布相当迅速且可靠,并且对提供的 libdefs 的更改通常会快速合并。

我将保留对这种事态可能令人满意或不令人满意的评论,但如果有人面临这些担忧,那么希望这是您制定解决方案所需的所有信息。

于 2020-12-19T19:26:35.720 回答