我如何决定是否@types/*进入“依赖项”或“devDependencies”?

我在我的项目中使用TypeScript 2。我想使用一些js库,但也为该库的类型。我可以用简单的npm install @types/some-library安装类型。我不确定我是否应该--save--save-dev他们。在我看来,甚至definetely类型化的GitHub自述文件都提到了两个版本,但从未解释过。我认为@types应该在devDependencies中,因为类型是开发所需的,而不是在运行时使用,但我在dependencies中多次看到@types。我困惑。

我应该如何决定@types/*是否进入dependenciesdevDependencies?有多少官方的指示吗?

105934 次浏览

如果你只是生成一个包,可能没有必要区分dependenciesdevDependenciesnpm的这个特性在发布一个可以被其他人使用的包时通常是有用的,并且你不想用冗余的依赖来垃圾邮件他们。

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

这种实践IRL的一个著名例子是create-react-app,默认情况下,它创建的未弹出样板文件将所有内容放在dependencies中,参见这个线程这个答案

假设您正在开发一个软件包“;在devDependencies中有@types/some-module包。由于某种原因,你从@types/some-module导出类型:

import { SomeType } from 'some-module';


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

现在TypeScript的消费者包"A"无法猜出SomeType是什么,因为devDependencies包"A"安装。

在这种特殊情况下,你需要@types/*包与常规的dependencies放在一起。对于其他情况,devDependencies已经足够好了。

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

npm install --production

npm ci --production

yarn --production

在这种情况下,类型应该在devDependencies中,以防止它们膨胀安装。

(为了避免误解,--production选项不能在构建应用程序的机器上使用,否则TypeScript编译器会报错。)

备注:我知道布拉德·威尔逊在另一个答案的评论中提到了这一点。不过,这一点似乎值得作为一个答案。

其他答案很有意义,但我要补充的是,peerDep的类型声明包也应该放在dependencies中,而不是peerDependencies中。

假设ba的一个插件。而c使用了ab

为什么@types/a不应该放在bpeerDependencies中?

如果bpackage.json像这样:

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

c只能使用在@types/a@1.2.x中定义的接口,但c将被迫安装@types/a@1.4.x

此外,c可能是一个常规的javascript包,而不是typescript包,但c也被强制安装@types/a@1.4.x

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

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