从另一个npm包扩展接口

时间:2020-05-18 06:21:40

标签: typescript

我正在构建可重复使用的工具。我有主程序包(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 moduledeclare module之类的东西可以自动合并。有没有一种方法可以实现我的目标而无需导出其他接口?

更新1: 在网上进行了更多调查之后,我来到了这段代码:

import p1 from "p1";

declare module "p1" {
  interface IUser {
    username: string;
  }
}

现在的问题是VSCode。该代码正确编译,VSCode表示以前的字段不存在。

0 个答案:

没有答案