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

问题描述

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

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

是否有某种简单的方法可以将函数插入SOME工具或其他工具中,以便在Flow看到之前随意转换代码?还是实际上我必须深入研究Flow的源代码并对其进行更改才能完成此工作? (我对此没有足够的兴趣。)

解决方法

[Flow]似乎不接受Babel插件。

否,flow支持某些建议的ECMAScript功能(其中一些功能以前位于flow config选项之后),但是它没有任何插件系统。

也许它完全自行解析代码,甚至不使用Babel?

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

Flow本身会使用插件吗?我不知道。

不。我认为this是最相关的问题,表明了这种可能性:

我可以想象的一个示例是,如果您想在流程之前放置一些Babel转换,以将实验性/自定义语言功能转换回ES6,而不必将其写入JS文件,然后再次重新解析。

在这种情况下,他说的是,如果流可以将任意兼容的AST用作输入并对其进行类型检查,则可以在将AST馈入流中之前对该AST进行babel变换。 / p>

是否有某种简单的方法可以将函数插入SOME工具或其他工具中,以便在Flow看到之前随意转换代码?还是实际上我必须深入研究Flow的源代码并对其进行更改才能完成此工作? (我对此没有足够的兴趣。)

答案在上面。您描述的工具通常是babel。基本上,您可以对代码运行babel转换,以删除流无法识别的构造,然后使用流检查生成的中间JavaScript文件。从本质上讲,该解决方案避免了诸如LSP或其他实时检查之类的可能性,因为在两步过程中,您将始终执行全面检查。

在一天结束时,很少有这种方法值得的情况。这种情况需要高度不规范。