gpt4 book ai didi

node.js - Typescript扩展模块(增强)

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:40 26 4
gpt4 key购买 nike

我想用我自己的类和函数扩展已安装的模块(Mongoose)。我编写了函数和类,它们工作得很好。

现在我想将它们添加到 mongoose 模块中。所以我现在拥有的是这个文件:mongoInstance.ts

import * as mg from 'mongoose'

class _Schema extends mg.Schema {
constructor(definition?: mg.SchemaDefinition, options?: mg.SchemaOptions) {
super(definition, options)
this.addData()
}
private addData() {
//do stuff
}
}

function _limitedRequest(schema: mg.Schema, options = 200) {
schema.pre("find", function (next) {
this.limit(options)
next()
})
}

declare module 'mongoose' {
export class _Schema extends Schema {
constructor(definition?: SchemaDefinition, options?: SchemaOptions)
private addData(): void
}
export function _limitedRequest(schema: Schema, options?: number): void
}

现在我可以在我的应用程序中的任何位置执行以下操作:

otherFile.ts

import * as mg from 'mongoose'
//doesnt work
var test1= new mg._Schema({})
//works
var test2= new mg.Schema({})

所以 VSCode 向我建议我的类(class),并且 Intellisense 可以工作。但似乎没有该类的实现。将我的代码编译为 bundle.js 时,Webpack 不会抛出任何错误,但是当我尝试使用 node bundle.js 运行我的bundle.js 时,它会显示:类型错误:mg._Schema 不是构造函数

最佳答案

你需要两件事:

  1. 使用声明文件扩展 mongoose 的类型定义。
  2. 添加功能,使模块符合其新定义。

mongoose.d.ts

创建一个声明文件 (*.d.ts) 并将其包含在您的项目中。

import * as mg from 'mongoose';

declare module 'mongoose' {
export class _Schema extends mg.Schema {
constructor(definition?: mg.SchemaDefinition, options?: mg.SchemaOptions);
}

export function _limitedRequest(schema: mg.Schema, options: number): void;
}

mongoose-instance.ts

添加您刚刚声明的功能。

import mg from 'mongoose';

mg._Schema = class extends mg.Schema {
constructor(definition?: mg.SchemaDefinition, options?: mg.SchemaOptions) {
super(definition, options)
this.addData()
}
private addData() {
//do stuff
}
}

mg._limitedRequest = function _limitedRequest(schema: mg.Schema, options = 200) {
schema.pre("find", function (next) {
this.limit(options)
next()
})
}

export default mg;

consumer.ts

从现在开始,使用本地版本的 mongoose

import mongoose from '../path/to/mongoose-instance';

console.log(mongoose._Schema);

如果您遇到与默认导入相关的任何问题,请确保在 tsconfig.json 中启用这两个标志:allowSyntheticDefaultImportsesModuleInterop .

关于node.js - Typescript扩展模块(增强),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54389424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com