【问题标题】:Is there a `declare` keyword in ES6/7?ES6/7 中是否有 `declare` 关键字?
【发布时间】:2016-02-23 16:50:39
【问题描述】:

最近我一直在学习 ES6,这导致我经常使用 Babel。作为好奇的类型,我开始查看 Babel Github 存储库,以了解他们如何构建这个很棒的工具,并知道我是否可以以某种方式做出贡献。

但是,我遇到了this file,上面写着declare class BabelNodeSourceLocation {}之类的东西,文件以.js结尾。

这让我很困惑,我现在想知道 JavaScript 中是否有一个我不知道的 declare 关键字,或者这只是 Babel 特定的语法?我所有的 Google 搜索都没有结果。

更新:将代码放在Babel REPL 中没有任何结果。 Babel 只是忽略了代码并且没有产生任何等效的 ES5 输出。它也没有抛出任何错误。

【问题讨论】:

  • 有趣。我认为那是打字稿。不知道为什么它有 .js 扩展名。

标签: javascript ecmascript-6 babeljs


【解决方案1】:

文件以 .js 结尾。

如今这并不意味着什么 :-)

我想知道 JavaScript 中是否有我不知道的 declare 关键字

不,没有。

或者这只是 Babel 特有的语法?

没有。它是 Flow 类型检查器的 type declaration file

【讨论】:

  • 我猜应该是Flow。
  • @FelixKling:你是对的。这不是.d.ts 后缀:-)
  • 来自Babel repository“添加脚本为babel类型生成流lib文件”
  • @zeroflagL:啊,我没看history
  • 这会与用于拉入已声明模块的 import 语句混淆。 flow-typed 通过使用与 npm 模块名称相同的字符串导入类型,使类型导入可用。神奇的是,现在看来,这些导入语句引用了flow-typed 目录中的内容,而不是模块本身。但是 webpack、babel 和类似 eslint 的东西是如何处理这个的还不清楚。这对我来说是在尝试创建自定义流类型并使它们可导入时出现的。见here
【解决方案2】:

使用 Flow,您可以声明一个全局类,允许您在项目中的任何位置引用该类类型。这对运行时代码没有影响,也不会影响 babel 输出。

来自the docs的例子:

declare class URL {
  constructor(urlStr: string): URL;
  toString(): string;

  static compare(url1: URL, url2: URL): boolean;
};

然后在您的项目中,您可以将 URL 作为类类型引用。

同样,您可以声明其他全局类型、模块、函数、变量。让它们井井有条的好方法。

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 2017-02-01
    • 2022-09-29
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2016-03-11
    • 2020-10-11
    相关资源
    最近更新 更多