打字稿:如何扩展现有的模块定义?

Posted

技术标签:

【中文标题】打字稿:如何扩展现有的模块定义?【英文标题】:typescript: How to extend existing module definition? 【发布时间】:2020-05-19 15:55:51 【问题描述】:

我有一个为 extsting npm 包编写的声明文件,但似乎没有声明一个方法,我尝试声明它,但出现错误。请帮帮我。

现有 d.ts 文件的结构:

declare module "mongoose" 
...
  class Document 
  interface Document extends MongooseDocument, NodeJS.EventEmitter, ModelProperties 
    increment(): this;
    remove(fn?: (err: any, product: this) => void): Promise<this>;
    ...
  

我尝试添加到接口 Document 方法 deleteOne。我的 custom.d.ts:

declare module "mongoose" 
  interface Document 
    deleteOne(fn?: (err: any, product: this) => void): Promise<this>;
  

但我仍然收到错误“类型上不存在属性'deleteOne'”。

如果需要,这是我的 tsconfig.json:


    "compilerOptions": 
      "module": "commonjs",
      "removeComments": true,
      "esModuleInterop": true,
      "moduleResolution": "node",
      "allowJs": true,
      "allowSyntheticDefaultImports": true,
      "pretty": true,
      "resolveJsonModule": true,
      "sourceMap": true,
      "target": "ES2018",
      "outDir": "dist",
      "baseUrl": ".",
      "paths": 
          "*": [
              "node_modules/*"
          ]
      
    ,
    "include": [
      "src/**/*"
    ],
    "exclude": [
      "node_modules",
      "dist",
      "**/*.spec.ts"
    ]
  

我的 custom.d.ts 文件位于 'src/' 目录中。

【问题讨论】:

你不能在你的代码中使用标准的@types/mongoose吗? npmjs.com/package/@types/mongoose @skyhavoc 它已经是@types/mongoose。对我来说学习如何声明也很重要,而不仅仅是使用模块 会不会是因为你的document 接口没有扩展? interface Document extends MongooseDocument, NodeJS.EventEmitter, ModelProperties? @hazardous 我尝试扩展,但得到了相同的结果 - 错误 【参考方案1】:

定义 Mongoose 接口

// types/mongoose/index.d.ts
declare module 'mongoose' 
  namespace Mongoose 
    export interface MyInterface 
      name: number;
    
  

用法

// app.ts
import mongoose,  Mongoose  from 'mongoose';
const a: Mongoose.MyInterface = 
  name: 122
;

我还在我的 tsconfig 文件中添加了"typeRoots": ["./node_modules/@types", "./server/types"],

这有帮助吗

【讨论】:

它不起作用,但对我来说是一个很好的提示 - 更改我的 tsconfic 文件【参考方案2】:

好的!现在我知道这是 ts-node 的预期行为:https://github.com/TypeStrong/ts-node#help-my-types-are-missing 我已经在 tsconfig.json 中配置了路径设置,现在一切正常:

    "paths": 
        "mongoose": ["src/custom.d.ts"],
        "*": [
            "node_modules/*"
        ]
    

【讨论】:

以上是关于打字稿:如何扩展现有的模块定义?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs 打字稿和模块问题

编译节点模块时出现打字稿错误

在 AOT 中构建 Angular 模块时出现打字稿错误

在打字稿角度应用程序中解析模块时出现404

使用打字稿时出现“未捕获的 ReferenceError:未定义角度”

使用打字稿和模块 css 反应库 [重复]