【问题标题】:Typescript errors in external npm dependencies外部 npm 依赖项中的打字稿错误
【发布时间】:2017-01-05 23:30:12
【问题描述】:

我有一个tsconfig.json 文件,其中不包括:

"exclude": [
  "node_modules",
  "**/*-test.ts",
  "typings/*",
  "**/*.d.ts"
]

但在我尝试转换和 lint 时,我收到以下错误:

node_modules/aws-sdk/lib/request.d.ts(166,16):错误 TS2304:找不到名称“Promise”。

这有意义吗?我认为应该根据上述排除排除外部依赖项中的任何错误。

附言代码——包括第 3 方部门——运行良好

【问题讨论】:

    标签: typescript


    【解决方案1】:

    exclude 部分告诉编译器不编译哪些文件/文件夹,但如果正在编译的文件使用排除列表中的文件,它仍将被编译,或者如它所述 @987654321 @:

    通过“文件”包含的文件引用的任何文件或 “包括”属性也包括在内。同样,如果文件 B.ts 是 被另一个文件 A.ts 引用,那么 B.ts 不能被排除,除非 引用文件 A.ts 也在“排除”列表中指定。

    如果您使用的库使用了Promise,那么您最好定位es6,这应该会使此错误消失,但如果您不想这样做,那么您可以使用--skipLibCheck compiler option

    跳过所有声明文件的类型检查 (*.d.ts)


    编辑

    aws-sdk-js github 自述文件中,在Pre-requisites 下的Usage with TypeScript 部分中明确指出:

    您的 tsconfig.json 或 jsconfig.json 包含“dom”和 compilerOptions.lib下的'es2015.promise'

    【讨论】:

    • 我的目标是 Node 4.x,所以我不能去 es6 但是像 AWS 这样受欢迎的外部方不应该自己解决 WRT 到 Promise 吗?同样值得我在我的代码中使用 Bluebird 作为 Promise ......尽管可能不是在所有引用此依赖项的模块中。 Bluebird 不应该使用“Promise”为第三方库提供定义吗?
    • aws 库不知道您正在使用 bluebird,因此它不会导入它(我的猜测),这就是它不可用的原因。
    • 是的,这部分是有道理的,但如果我正在导入 Bluebird AWS(并且 Bluebird 确​​实定义了“Promise”),那么不应该避免这个错误吗?我没有确认在我导入aws-sdk 的任何情况下,我也导入import * as Promise from 'bluebird'
    • 您的 模块中导入 bluebird 不会使其在您正在导入的其他模块中可用。例如,也许 aws 库实际上使用的是 bluebird 本身,但版本与您的不同?也许它使用了另一个 Promise 库。
    • 好吧,这本来是我的推测,但后来它行为不端,对吧?它是假设,但没有定义 Promise 定义。
    【解决方案2】:

    尝试在 tsconfig.json 中添加以下代码:

    "compilerOptions": {
            "lib": [
              "es5",
              "es2015.promise"
            ]
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2015-11-16
      • 2018-02-27
      • 2015-03-01
      • 2020-04-02
      • 2013-10-06
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多