对于 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
的目标默认设置lib
为DOM,ES5,ScriptHost
,而es6
的目标默认设置lib
为DOM,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 项目——简单的环境配置