I use TypeScript 2 in my project. I'd like to use some js library, but also typings for that library. I can install types with simple npm install @types/some-library. I'm not sure if I should --save or --save-dev them. It seems to me that even DefinetelyTyped GitHub readme kind of mentions both versions, but never explains them. I would think that @types should be in devDependencies, as types are needed for development and aren't used in runtime, but I saw many times @types in just dependencies. I'm confused.

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


当前回答

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

NPM安装——生产或

NPM ci——生产或

纱线,生产

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

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

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

其他回答

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

假设b是a的一个插件,c使用a和b。

为什么不应该把@types/a放在b的peerDependencies中?

如果b是包裹。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。

所以,正确的包装。Json (b)应该像这样:

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

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

NPM安装——生产或

NPM ci——生产或

纱线,生产

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

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

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

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

import { SomeType } from 'some-module';

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

现在,包“A”的TypeScript使用者无法猜出SomeType是什么,因为包“A”的devDependencies还没有安装。

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

如果你只是生成一个bundle,可能没有必要区分dependencies和devDependencies。npm的这个特性通常在发布一个可以被其他人使用的包时很有用,而且你不想用冗余的依赖来滥发它们。

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

这种实践IRL的一个著名的例子是create-react-app,默认情况下,它创建的未弹出样板文件将所有东西放在依赖关系中,请看这个线程和这个答案