Facebook的Flow支持type annotations。 Specyfing类型是JavaScript中不可用的东西(由于它的弱类型性质,可能永远不会出现) - 它是TypeScript语言的一个主要特性。
我的问题是 - 如何在JavaScript代码中使用Flow的类型注释,知道JS不支持类型注释 - 它只是语言之外的东西。
我的评论:当然,我可以使用JS的另一个预处理器来删除注释(无论是在grunt,gulp,webpack还是其他任何方面),但这是一个额外的步骤,使自动化更加昂贵。对我来说,这似乎是非常糟糕的设计,所以我想可能有更好的解释/解决方案。
此外,类型注释是TypeScript功能。由于流支持它,这是否意味着Flow的目标不仅是JavaScrpt,还有TypeScript?如果是这样,那么我为什么要使用flow而不是TypeScript?
答案 0 :(得分:1)
你有很多选择。
在Flow或TypeScript中,您可以使用类型注释或使用注释。如果您不在TypeScript中使用类型注释,则可以使用--allowJs
标志并按照惯例在JS Doc注释中编写类型:
如果您使用的是句法类型注释(例如a: string
),则需要使用Babel或TypeScript删除它们。
如果您正在使用类,导入,箭头功能等ES6 +功能,并希望定位与ES5兼容的浏览器,则需要使用一些转换步骤将这些结构转换为兼容代码。 Babel或TypeScript都可以这样做。因为Flow通常被链接到Babel,所以它基本上是“免费的”,就像它在TypeScript中一样。
如果要使用特定于TypeScript的enum
或namespace
,则必须使用TypeScript。如果你想使用Babel为你做ES6变换(也许你有一些想要运行的插件),你可以将TypeScript ES6输出链接到Babel,这样只有一个下层正在进行。
Flow和TypeScript有一些不同的类型系统。有一些细微的差别,但没有什么大的。
每个人的支持者会向您展示在一个而不是另一个中工作的示例,例如
var arr = [10, "ok"];
arr.pop();
arr.push(10);
arr[1].substr(1); // crashes
和
function square(x) { return x * x };
console.log(square('a hundred')); // prints NaN
答案 1 :(得分:0)
Flow支持javascript注释中的类型注释,但我想象Flow的最大参数与Typescript相比,没有太多的转换。您的javascript保持不变,并获得静态类型的好处。另外,如果您阅读有关flow的文档,它有自己的方法来删除类型注释;认为它有点像编译。
编辑:看起来我不正确,打字稿也支持基于注释的注释。