用声明名称空间覆盖node_modules包的类型

时间:2019-11-05 19:27:34

标签: typescript typescript-typings

上下文

最近对DefinitelyTyped的笑话类型进行了更新,将接口从Matchers<R>更改为Matchers<R,T>,但是jest-extended拥有自己的类型,但尚未更新,导致TypeScript失败,原因: / p>

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

有一个PR,但是该回购交易没有太多活动,因此可能需要一段时间才能合并。

我想在项目中覆盖其类型,但遵循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<R>,而TSLint现在对await-promise很满意)。

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

如何在项目内部完全覆盖类型?

这是否正确使用了typeRoots

如何以更一般的方式处理此问题? (不只是开玩笑而已)

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您需要在typeRoots选项中显式指定@types目录的顺序。例如,如果您有文件夹“ node_modules / @ types”和“ src / @ types”,则第一个应该是“ src / @ types”并指定“ exclude”。

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