【问题标题】:recommended typescript config for node 8节点 8 的推荐 typescript 配置
【发布时间】:2018-06-30 21:38:52
【问题描述】:

如果我想使用节点 8 编译的源代码,推荐的 typescript 配置是什么?

大多数教程使用以下 tsconig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  }
}

但现在我发现,并非所有可用功能都受支持。例如['foo'].includes('bar') 抛出错误:属性 'includes' 在类型 'string[]' 上不存在。

我找到了解决此问题的issue。解决方案是使用库es7。 我可以覆盖默认库:"lib": ["es7"]

但我不确定这是否是节点 8 的最佳配置 - 是否还有更多功能不受该库的支持?定义了很多特性吗?

所以我的问题是:如果我想使用节点 8,targetlibmodule 的最佳配置是什么?

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    从 Node.js 8.10.0 开始,支持 100% 的 ES2017。如果您知道您的目标是该版本或更高版本,则最佳配置如下所示:

    • "module": "commonjs"

      Node.js 正在添加 ES-Modules,但现在我们必须坚持使用 CommonJS。

    • "target": "es2017"

      这告诉 TypeScript 可以输出带有 ES2017 特性的 JavaScript 语法。在实践中,这意味着它将例如输出 async/await 而不是嵌入 polyfill (__awaiter)。

    • "lib": ["es2017"]

      这告诉 TypeScript 可以使用 ES2017 或更早版本中引入的函数和属性。在实践中,这意味着您可以使用例如Array.prototype.includesString.prototype.padStart

    完整的配置将是:

    {
      "compilerOptions": {
        "lib": ["es2017"],
        "module": "commonjs",
        "target": "es2017"
      }
    }
    

    如果你运行的是 Node.js 16,你可以看到我的similar answer for Node.js 16 here

    如果你运行的是 Node.js 14,你可以看到我的 similar answer for Node.js 14 here

    如果你运行的是 Node.js 12,你可以看到我的 similar answer for Node.js 12 here

    如果你运行的是 Node.js 10,你可以看到我的similar answer for Node.js 10 here

    【讨论】:

    • 我试图找到一些东西来确认 8.10.0+ 支持 100% 的 ES2017。 Kangax 的兼容性表只显示 8.9.x,所以它已经过时了。节点变更日志没有对 ES2017 兼容性做出任何声明。你有这方面的资料吗?
    • node.green 是 Kangax 表的更新版本,专门为 Node.js 版本量身定制,这就是我所关注的 ?
    • 哇,我查看了 node.green 并且永远不会发现它,因为它隐藏在 9.11.1 标题下。我希望有一种方法可以指定表中显示的版本。感谢您的帮助。
    • 我不确定但不应该为节点指定 noLib 选项吗?
    • @velop Promise.finally 是 ES2018 的一部分,而不是 ES2017。 Node.js 10.0.0 和更新版本支持它。如果您正在运行 Node.js 10,请查看以下答案:stackoverflow.com/a/57607634/148072
    【解决方案2】:

    我确定您已经找到了,但这里有 Microsoft 的入门模板:https://github.com/Microsoft/TypeScript-Node-Starter

    虽然您仍在使用 Node 8.x,但请将您的 module 设置为 commonjstarget 可以是 es6

    compilerOptions.lib 仅定义编译器用于编译时检查的声明,它不影响tsc 的输出。换句话说,您可以使用任何您想要的lib,而不必担心您的转译代码会有所不同(这完全由compilerOptions.target 控制)。

    在您的情况下使用es7 作为lib 会很好,并且会为您提供 ES7 及以下版本的类型声明。

    Array.includes 是 ES7 (ES2016),因此您发现它不是 ES6 的一部分。您可以将您的 lib 定义为; lib: ["es6", "ES2016.Array.Include"] 解决您的问题。

    【讨论】:

    • 根据node.green,您可以在Node 8.9.4 中安全地定位es2016,如果您想使用本机async/await,您可以避免定位es2017
    【解决方案3】:

    TypeScript wiki 中有一个页面列出了针对各种节点版本的推荐 TSConfig 设置。

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 2012-05-05
      • 2013-05-26
      • 2020-08-04
      • 2013-08-02
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多