排除/覆盖 npm 提供的类型

Posted

技术标签:

【中文标题】排除/覆盖 npm 提供的类型【英文标题】:Exclude/overwrite npm-provided typings 【发布时间】:2017-05-28 09:55:26 【问题描述】:

我有一个 npm 包,其中包含写得不好、过时的类型。我已经编写了自己的类型,现在我想知道是否可以以某种方式从 npm 包中排除原始类型。不是简单的接口扩展,原来的东西现在基本都是垃圾。

使用 tsconfig.json 中的排除列表当然不能用于此目的,因为即使您排除了该文件夹,它仍会从 node_modules 加载文件。

【问题讨论】:

您可以尝试在tsconfig.json 中使用paths 来覆盖this answer 中描述的任何模块的类型 这是正确的答案。我用谷歌没有找到这个问题,因为我尝试了各种措辞,但显然不是那个。 随意添加它作为答案,我会接受它 【参考方案1】:

您可以使用 tsConfig 中的路径选项获得所需的行为 它可能看起来像这样:


    "compilerOptions": 
       ...
        "paths": 
            "*": [
                "src/*",
                "declarations/*"
            ]
        
    ,
    ...

使用此配置,打字稿在 src(应该有所有应用程序源)和声明中查找模块,我通常在声明文件夹中放置我额外需要的声明。

要覆盖节点模块的类型,有两个选项:

    在声明文件夹中放置一个与模块名称类似的文件夹,其中包含一个名为 index.d.ts 的文件,用于分型

    在声明文件夹中放置一个声明文件,以模块命名

作为一个工作示例,您可以查看此 repo https://github.com/kaoDev/react-ts-sample

Bernhard Koenig 的重要提示:

路径的顺序很重要。我必须将带有我的覆盖的路径放在带有原始类型定义的路径之前,以便我的覆盖首先被拾取。 ——伯恩哈德·科尼希

【讨论】:

不适用于 nats-hemera npm 模块,你能检查一下吗? 路径的顺序很重要。我必须将带有我的覆盖的路径放在带有原始类型定义的路径之前,以便我的覆盖首先被拾取。 小心两件事,路径覆盖:1) 路径重定向的右侧“目标”相对于 baseUrl。如果设置错误,它可能会静默失败(或者对某些人有效,但对其他人无效,具体取决于引用 d.ts 文件的方式)。 2) 即使设置正确,某些情况下也需要您在项目*.d.ts 文件的某处添加一个空的declare module "my-module"; 声明。需要上述两个修复的示例:mst-decorators@2.1.1(那个确切的版本)【参考方案2】:

src 下创建node_modules 文件夹,然后将要覆盖的模块的类型放入其中:

├── node_modules
│   └── ...
│
└── src
    ├── index.ts
    ├── ... your codes ...
    │
    └── node_modules
        └── <module-to-be-overwritten>
            └── index.d.ts

tsconfig.json中的compilerOptions无需修改。

阅读https://www.typescriptlang.org/docs/handbook/module-resolution.html 中的TypeScript 如何解析模块部分。

【讨论】:

这并不适用于所有情况——例如,mst-decorators@2.1.1(那个确切的版本)——但适用于大多数情况。不过,我更喜欢paths approach,因为它适用于每种情况,并且不需要创建假/覆盖目录。 (我宁愿在tsconfig.json 中添加一行,而不是创建两个新文件夹和一个仅是存根的文件——尽管各有自己的)

以上是关于排除/覆盖 npm 提供的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤振测试覆盖率中排除文件?

从代码覆盖中排除生成的源而不影响整体代码覆盖

如何在 TeamCity 的 dotCover 中排除类型和方法?

使用 Cobertura 从代码覆盖中排除方法

SonarQube 代码覆盖率 - 排除某些类

从 gcov/lcov 覆盖结果中排除某些功能