我正在构建可重复使用的工具。我有主程序包(p1),该程序包导出一个名为“ IUser”的接口。我想在另一个npm包(p2)中扩展此接口。 p1和p2都是使用config的打字稿编写的:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"lib": ["es6", "dom", "esnext"],
"noImplicitAny": false,
"rootDir": "./src",
"outDir": "./dist",
"allowSyntheticDefaultImports": true,
"pretty": true,
"removeComments": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"declaration": true,
"typeRoots": ["node_modules/@types"]
},
"include": ["src/**/*.ts"]
}
在p2中执行此操作:
import { IUser } from "p1";
declare module "p1" {
interface IUser {
a: number;
}
}
这基本上会覆盖IUser的接口。而且我只能访问a: number
。
我也尝试了经典的扩展接口:
import { IUser } from "p1";
interface IUser {
a: number;
}
// GOT: Import declaration conflicts with local declaration of 'IUser'.ts(2440)
我的问题仍然存在,有没有办法从另一个软件包扩展现有接口?另外请记住,如果在p2中,我在declare module
文件中执行.d.ts
,则它不允许我访问任何其他导出,就好像它完全覆盖了它。
我希望有extend module
或declare module
之类的东西可以自动合并。有没有一种方法可以实现我的目标而无需导出其他接口?
更新1: 在网上进行了更多调查之后,我来到了这段代码:
import p1 from "p1";
declare module "p1" {
interface IUser {
username: string;
}
}
现在的问题是VSCode。该代码正确编译,VSCode表示以前的字段不存在。