我在我的项目中使用 TypeScript 2。我想使用一些 js 库,但也想为该库打字。我可以用简单的
npm install @types/some-library
安装类型。我不确定我是否应该--save
或--save-dev
他们。在我看来,即使是 DefinetelyTyped GitHub 自述文件也提到了这两个版本,但从未解释过它们。我会认为@types 应该在devDependencies
中,因为类型是开发所需要的并且不会在运行时使用,但我在dependencies
中看到了很多次@types。我很困惑。
我应该如何决定@types/*是进入
dependencies
还是devDependencies
?实际上有一些或多或少的官方说明吗?
假设您正在开发一个包“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
就足够了。
如果您只是生成一个包,则可能无需区分
dependencies
和 devDependencies
。 npm
的这个特性在发布一个可以被其他人使用的包时通常很有用,并且你不想用冗余的依赖项向他们发送垃圾邮件。
可能还有其他用例,其中拆分依赖项可能会有所帮助,但除非您对此有明确的需求,否则我的建议是只选择其中一个并将所有内容放在那里。如果需要的话,之后拆分它们并不难。
这种实践 IRL 的一个著名示例是
create-react-app
,默认情况下,它创建的未弹出样板将所有内容都放在 dependencies
中,请参阅 this thread 和 this answer
在将 Node.js 应用程序部署到生产环境的特定情况下,人们只想安装运行该应用程序所需的依赖项。
npm install --omit=dev
或
npm ci --production
或
yarn --production
在那种情况下,类型应该在
devDependencies
中,以防止它们使安装膨胀。
(为避免误解,
--production
选项不得在构建应用程序的机器上使用,否则 TypeScript 编译器会报错。)
备注:我知道 Brad Wilson 在对另一个答案的评论中提到了这一点。不过,这一点似乎值得回答。
其他答案很有意义,但我要补充一点,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"
}
}