打字稿:如何扩展现有的模块定义?
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/*"
]
【讨论】:
以上是关于打字稿:如何扩展现有的模块定义?的主要内容,如果未能解决你的问题,请参考以下文章