我可以让 Flow 使用任意的 Babel 插件(或其他代码转换小部件)吗?

Can I make Flow use an arbitrary Babel plugin (or other code-transforming widget)?

我正在使用 Create React App 和 Flow。我可以通过在 config-overrides.js 中指定它们来添加任意 Babel 插件以用于 Create React App(在 react-app-rewired 和 customize-cra 的帮助下)。我可以通过在 babel.config.js 中命名它们来添加用于我的 Jest 测试的 Babel 插件。通过这些方式,我可以在这些工具有机会被我想使用的任何非标准语法(例如 JavaScript 装饰器)混淆之前转换代码。

但我不知道如何为 Flow 做同样的事情。它似乎不接受 Babel 插件。也许它完全自己解析代码,甚至不使用 Babel?我不知道。 Flow 本身是否需要插件?我不知道。

是否有一些简单的方法可以让我将函数插入某些工具或其他工具,以便在 Flow 看到它之前任意转换我的代码?或者我真的必须深入研究 Flow 的源代码并更改它才能完成此操作吗? (我没有足够的兴趣去做那个。)

[Flow] doesn't seem to accept Babel plugins.

不,flow 支持一些提议的 ECMAScript 功能(其中一些以前在 flow 配置选项后面),但它没有任何类型的插件系统。

Maybe it parses code completely on its own and doesn't even use Babel?

确实如此。 Flow 实现了一个 fully-fledged JavaScript -> AST parser,可以完全独立于流类型检查器使用。

Does Flow itself take plugins? I don't know.

没有。我认为 this 是暗示这种可能性的最相关问题:

one example I could imagine is if you wanted to put some Babel transforms in front of flow, to transpile experimental/custom language features back to ES6 without having to write it to a JS file and then reparse it again.

在这种情况下,他是说如果流可以将任何兼容的 AST 作为输入并对其执行类型检查,那么可以在该 AST 之前 执行 babel 转换流入流中。

Is there some simple way for me to plug a function into SOME tool or other in order to arbitrarily transform my code just before Flow sees it? Or would I actually have to dig into Flow's source code and alter it in order to accomplish this? (I am not interested enough to do that.)

上面已经暗示了答案。您描述的工具通常是 babel。基本上你可以 运行 babel 转换你的代码以删除 flow 无法识别的结构,然后使用 flow 检查生成的中间 JavaScript 文件。从本质上讲,此解决方案排除了 LSP 或其他 real-time 检查之类的可能性,因为您总是会在 two-step 过程中执行全面检查。

归根结底,很少有情况值得采用这种方法。这种情况需要高度 non-standard.