typescript - 打字中的环境依赖性和常规依赖性之间有什么区别

标签 typescript typescript-typings

在以下 typings.json 文件中,ambientDependencies(或 globalDependencies)和常规依赖项之间的区别是什么:

{
  "ambientDependencies": {
    "es6-shim": "registry:dt/es6-shim#0.31.2+20160317120654",
    "jasmine": "registry:dt/jasmine#2.2.0+20160412134438",
    "jquery": "registry:dt/jquery#1.10.0+20160417213236"
  },

"dependencies": { }, <--- what does this do?

}

typings install <something> --save将保存到依赖项,但这是什么意思?

最佳答案

假设您有两个依赖项:

package.json

{
    "dependencies": {
        "a": "1.0",
        "b": "2.0"
    }
}

依赖树的样子:

|-a@1.0
|-b@2.0

在这种情况下,将它们都设置为 globalDependenciesdependencies 没有区别。 但是,当它们有自己的依赖项时,就会出现问题。想象一下您的依赖关系树如下所示:

|-a@1.0
|  |-b@1.0
|  |-c@1.0
|-b@2.0

当您将 a@1.0 作为全局依赖安装时,它将去除对 b@1.0c@1.0 的引用,并将要求您将这些依赖项安装为全局变量。它要求您将依赖关系树展平为:

|-a@1.0
|-b@1.0
|-b@2.0
|-c@1.0

这适用于 c@1.0,但现在您需要两个版本的 ba@1.0 依赖于 b@1.0,但您的应用依赖于 b@2.0。您安装哪种类型的版本?如果安装 b@2.0a@1.0 的类型定义可能会中断。如果您安装 b@1.0,您的应用类型可能会崩溃。这就是 globalDependencies 面临的问题。

当您使用 typings 构建类型定义并将其作为常规依赖项安装时,它会包装子依赖项而不会将它们暴露给您的应用程序。这意味着如果您将 a@1.0 安装为常规依赖项,它将不会使用顶级 b@2.0 定义。它将改为使用自己的私有(private) b@1.0,不会污染您的全局命名空间。实际上,常规依赖项会保留您的依赖项树结构,并且它们是处理定义的首选方式。问题是并非所有库都将类型定义构建为常规依赖项。理想情况下,随着人们编写更多定义,全局变量自然会被淘汰。

关于typescript - 打字中的环境依赖性和常规依赖性之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994539/

相关文章:

javascript - Typescript/Javascript 中的 Swift 闭包

javascript - 在 TypeScript 中使用相同的 Update 方法添加用户时设置自动 id

angular - 没有 Http 的提供者

TypeScript 和 React Native : Are the type definitions for RN styles wrong?

node.js - 如何导入没有可用类型的 npm 模块?

jquery - 如何在 typescript 类中将 jquery 插件(如 Owl Carousel 2)与 Angular 4 一起使用?

javascript - 未知的编译器选项包括和排除

javascript - JSDoc typings for typescript for JavaScript reducer accumulator

TypeScript 函数在不期望的情况下通过类型检查

typescript :使用 `enum` 值作为 `type`