对于 Node.js 项目中的 TS 类型,@types/core-js 是不是仍然必要?

Posted

技术标签:

【中文标题】对于 Node.js 项目中的 TS 类型,@types/core-js 是不是仍然必要?【英文标题】:Is @types/core-js still necessary for TS typings in a Node.js project?对于 Node.js 项目中的 TS 类型,@types/core-js 是否仍然必要? 【发布时间】:2018-11-26 08:29:58 【问题描述】:

我有几个使用简单 TypeScript 配置的纯后端 Node.js 项目。

2018 年 3 月之前,我在 package.json 中有这个:

  "devDependencies": 
    "@types/core-js": "^0.9.46",
    "@types/node": "^9.6.2"
  

自 2018 年 3 月以来,我一直在省略 "@types/core-js",一切似乎都可以正常编译。我们还需要"@types/core-js" 吗?

【问题讨论】:

只有在使用 core-js polyfills 并且没有被“标准目标类型”(ES5、ES6 ...)或 tsconfig 的 lib 选项覆盖时,才需要 @types/core-js 类型跨度> 【参考方案1】:

我有几个用 TypeScript 编写的基于节点的项目。我从来没有在我的项目中使用过@types/core-js因此,绝对没有必要使用@types/core-js 来编写基于节点的代码。另一方面,拥有@types/node,如果你'将使用 Node 的 API。

如果您遇到编译器似乎不了解 ES6 中引入的功能而导致的编译问题,首先要做的是设置 lib 以加载您需要的正确类型。例如,如果您决定以 es5 为目标,但想使用 ES6 中引入的方法、类、函数,则需要在 lib 设置中指定 "es6",因为默认情况下目标 es5 加载 lib @ 987654330@也是。 (根据documentation,es5的目标默认设置libDOM,ES5,ScriptHost,而es6的目标默认设置libDOM,ES6,DOM.Iterable,ScriptHost。)

我遇到了一些非常罕见的情况,其中es6 库中缺少某些内容。在这种情况下,我只需编写一个定义来解决特定问题。加载@types/core-js可能也能解决这个问题,但它还包含很多其他不必要的东西,它给项目添加了一个依赖项,然后必须对其进行管理等等。不值得它。


上面的重点是 Node 项目,但即使在我依赖于 core-js 的基于 Web 的项目中,我也不使用 @types/core-js。在我看来,项目中core-js 的存在应该对项目的应用程序代码完全透明。我正在编写可在任何提供符合 ES6 或更高版本的 API 的平台上运行的代码,我不是在编写用于运行 core-js 的代码

【讨论】:

【参考方案2】:

如果您使用的声明中包含的内容在您的主要版本的 TypeScript 声明中不可用,则您应该只需要 @types/core-js。如果您希望使用 core-js 中的核心 javascript ES6 功能,但在您当时使用的 TS 版本中未实现,这将非常有用。 There's more information available on the TS GitHub related to your question 但实际上,如果您只是使用现有的 ES 东西,那么您将不再需要它。

编辑:在我将其声明为节点之前,但由于它是 TS,因此在所有可能的情况下,它可能不知道如何在没有声明的情况下编译到目标。从 TS 2 和 NodeJS 6 开始,您应该不再需要它了。

【讨论】:

公平地说,我不是打字稿的大用户。我确实喜欢这种语言,但我不在一个允许我编写很多代码的地方(可悲),所以我只打算使用我记得的类型(polyfills 和参考信息)可能已过时。我使用的最后一个主要版本是 1.8.10,如果我想使用某些 ES6 功能,我需要 core-js

以上是关于对于 Node.js 项目中的 TS 类型,@types/core-js 是不是仍然必要?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Typescript 开发 node.js 项目——简单的环境配置

TypeScript中的定时器

TypeScript Node.js 包

@Types/node/index.d.ts TypeScript 错误 TS2309

*.d.ts 文件来自哪里?

如何为特定版本的 node.js 安装 d.ts?