扩展和替换 TypeScript 中的现有接口

rel*_*one 3 typescript visual-studio-code typescript-typings

我目前正在为 Mongoose 开发一个插件。作为此的一部分,选项接口需要扩展,因为它可以容纳附加属性。为了实现这一目标,我正在执行以下操作。

我使用声明合并,所以我创建一个像这样的 TypingsFile

一些打字.d.ts

declare Interface QueryFindOneAndUpdateOptions {
  MyCustomField: string
}
Run Code Online (Sandbox Code Playgroud)

我还将此打字文件包含在我的 tsconfig.json 中

tsconfig.json

declare Interface QueryFindOneAndUpdateOptions {
  MyCustomField: string
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是这不起作用。仅当我在同一文件中声明两个具有相同名称的接口时,声明合并才有效。导入和定义接口会引发命名冲突。

知道如何解决这个问题吗?

rel*_*one 5

好的,答案很简单。基本上我犯了2个错误

  1. 我没有声明包含我想要扩展的接口的模块
  2. 我没有在 tsconfig CompilerOptions 中添加 typeRoots (我的问题中的“include”与此无关)

1 - 打字 (mongoose.d.ts)

我在./src/types中创建了一个 mongoose.d.ts (名称并不重要,但我更喜欢将其命名为我扩展的模块)文件。在这里我像这样扩展我的接口

猫鼬.d.ts

interface SpecialOptions {
  verySpecialStuff: string
  enable: boolean
}

declare module 'mongoose' {
  export interface ModelOptions {
    MyNewKey: SpecialOptions
  }
}
Run Code Online (Sandbox Code Playgroud)

这将通过MyNewKey扩展 mongoose 中现有的接口 ModelOptions

2 - 配置编译器

默认情况下,编译器只会检查./node_modules/@types的类型。因此,您需要告诉它也包含您的自定义类型。为此,需要像这样扩展编译器选项

tsconfig.json

{
// ...
  "compilerOptions" : {
    // ...
    "typeRoots" : [
      "src/types",
      "node_modules/@types"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)