我如何决定@types/*是进入`dependencies`还是`devDependencies`?

问题描述 投票:0回答:4

我在我的项目中使用 TypeScript 2。我想使用一些 js 库,但也想为该库打字。我可以用简单的

npm install @types/some-library
安装类型。我不确定我是否应该
--save
--save-dev
他们。在我看来,即使是 DefinetelyTyped GitHub 自述文件也提到了这两个版本,但从未解释过它们。我会认为@types 应该在
devDependencies
中,因为类型是开发所需要的并且不会在运行时使用,但我在
dependencies
中看到了很多次@types。我很困惑。

我应该如何决定@types/*是进入

dependencies
还是
devDependencies
?实际上有一些或多或少的官方说明吗?

typescript npm typescript-typings package.json
4个回答
303
投票

假设您正在开发一个包“A”,它在

@types/some-module
中有
devDependencies
包。出于某种原因,您要从
@types/some-module
:

导出类型
import { SomeType } from 'some-module';

export default class APackageClass {
  constructor(private config: SomeType) {
    // …       
  }
}

现在包“A”的 TypeScript 消费者无法猜出

SomeType
是什么,因为包“A”的
devDependencies
not安装。

在那种特殊情况下,您需要

@types/*
包与常规
dependencies
一起放置。对于其他情况
devDependencies
就足够了。


89
投票

如果您只是生成一个包,则可能无需区分

dependencies
devDependencies
npm
的这个特性在发布一个可以被其他人使用的包时通常很有用,并且你不想用冗余的依赖项向他们发送垃圾邮件。

可能还有其他用例,其中拆分依赖项可能会有所帮助,但除非您对此有明确的需求,否则我的建议是只选择其中一个并将所有内容放在那里。如果需要的话,之后拆分它们并不难。

这种实践 IRL 的一个著名示例是

create-react-app
,默认情况下,它创建的未弹出样板将所有内容都放在
dependencies
中,请参阅 this threadthis answer


41
投票

在将 Node.js 应用程序部署到生产环境的特定情况下,人们只想安装运行该应用程序所需的依赖项。

npm install --omit=dev

npm ci --production

yarn --production

在那种情况下,类型应该在

devDependencies
中,以防止它们使安装膨胀。

(为避免误解,

--production
选项不得在构建应用程序的机器上使用,否则 TypeScript 编译器会报错。)

备注:我知道 Brad Wilson 在对另一个答案的评论中提到了这一点。不过,这一点似乎值得回答。


1
投票

其他答案很有意义,但我要补充一点,peerDep 的类型声明包也应该放在

dependencies
而不是
peerDependencies
.

假设

b
a
的插件。
c
使用
a
b
.

为什么不应该将

@types/a
放在
b
peerDependencies
中?

如果

b
package.json
是这样的:

{
  "peerDependencies": {
    "a": "1.5.x"
    "@types/a": "1.4.x"
  }
}

c
可能只使用
@types/[email protected]
中定义的接口,但
c
被迫安装
@types/[email protected]
.

此外,

c
可能是一个常规的javascript包而不是typescript包,但是
c
也被强制安装
@types/[email protected]
.

所以,

package.json
的正确
b
应该是这样的:

{
  "peerDependencies": {
    "a": "1.5.x"
  },
  "dependencies": {
    "@types/a": "1.4.x"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.