排除/覆盖 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 提供的类型的主要内容,如果未能解决你的问题,请参考以下文章