【问题标题】:Override typings of node_modules package with declare namespace使用声明命名空间覆盖 node_modules 包的类型
【发布时间】:2020-03-02 05:29:53
【问题描述】:

上下文

最近,DefiniteTyped 上的笑话类型已更新,将接口从 Matchers<R> 更改为 Matchers<R,T>,但 jest-extended 有自己的类型,这些类型尚未更新,导致 TypeScript 失败:

error TS2428: All declarations of 'Matchers' must have identical type parameters.

有一个 PR,但 repo 没有太多活动,所以可能需要一段时间才能合并。

我想在我的项目中覆盖其类型,但遵循 thisthis 等建议无法正常工作。在这种情况下,在 tsconfig 中使用 paths 似乎并不正确,因为 jest-extended 并不意味着每次都被导入,而是增加了全局 jest 声明。文件以

开头
/// <reference types="jest" />

declare namespace jest {

并且没有importexport

我想要什么

我想覆盖 jest-extended 包的类型并提供我自己的,而不打开 skipLibCheck 并摆脱错误。

我尝试了什么

我正在像这样使用typeRoots

{
   // ...
   "typeRoots": ["./types/overrides", "node_modules/@types"],
}

我有文件types/overrides/jest-extended/index.d.ts,其中包含一个修改后的开玩笑扩展声明副本。我认为 TS 正在读取该文件,因为我看到了一些更改的效果(例如,我将 toReject(): R 的返回类型更改为 toReject(): Promise&lt;R&gt; 并且 TSLint 现在对 await-promise 感到满意)。

但是...我仍然看到错误,因为文件 node_modules/@types/jest/index.d.ts 仍然由 TypeScript 加载。我认为typeRoots 中的目录顺序会使 TS 只捕获我自己的文件。我无法使用 npm 卸载这些类型,因为它们不在不同的包中。

如何在我的项目中完全覆盖类型?

这是对typeRoots的正确使用吗?

如何以更一般的方式处理这个问题? (不仅仅是开玩笑)

提前谢谢你!

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    您需要在 typeRoots 选项中明确指定 @types 目录的顺序。例如,如果您有文件夹 «node_modules/@types» 和 «src/@types»,第一个应该是 «src/@types» 并指定排除。

    "typeRoots": ["src/@types", "node_modules/@types"], 
    "exclude": ["node_modules/jest-extended/types/*"]
    

    【讨论】:

    • 感谢您的回答。可悲的是,我也无法以这种方式完成这项工作。我稍后会尝试创建一个复制回购,也许我误解了一些东西。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2020-02-15
    • 2014-06-16
    • 1970-01-01
    • 2011-09-12
    • 2011-06-14
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多