如何替换@types/mongoose-delete中SoftDeleteModel的原有定义?
如何替换@types/mongoose-delete中的SoftDeleteModel接口定义
问题背景
我在使用mongoose-delete及其类型包@types/mongoose-delete时,发现SoftDeleteModel接口的声明存在问题,尝试通过自定义.d.ts文件扩展类型,但现在出现了两个SoftDeleteModel定义,无法替换原有声明。原类型声明放在MongooseDelete命名空间下,当我尝试在扩展代码中加入该命名空间时,修改完全不生效,猜测是泛型参数结构不一致导致生成了重载而非替换。
原类型声明片段:
import mongoose = require("mongoose"); declare namespace MongooseDelete { interface SoftDeleteModel< T extends Omit<mongoose.Document, "delete">, // ... 其他泛型参数 > extends mongoose.Model<T> { // ... 原有方法声明 } }
我的尝试代码(仅产生新增定义,无法替换):
// mongoose-soft-delete.d.ts import mongoose from 'mongoose'; import 'mongoose-delete'; declare module 'mongoose-delete' { interface SoftDeleteModel< T, //.. 剩余泛型参数 > }
解决方案
要替换原有接口而非新增,必须严格匹配原类型的命名空间和泛型参数结构,利用TypeScript的声明合并特性实现覆盖:
关键步骤
- 定位正确的命名空间:原
SoftDeleteModel属于MongooseDelete命名空间,扩展时必须在该命名空间内重新定义接口。 - 匹配泛型参数结构:泛型参数的数量、约束条件、默认值必须和原声明完全一致,否则TypeScript会将其视为新接口,导致重复定义。
- 继承并覆盖原有声明:重新定义接口时,继承原基础类型(如
mongoose.Model),然后覆盖需要修正的方法或属性。
正确的扩展代码示例
创建mongoose-soft-delete.d.ts文件,内容如下:
import mongoose from 'mongoose'; import 'mongoose-delete'; declare module 'mongoose-delete' { namespace MongooseDelete { // 完全匹配原接口的泛型参数结构与约束 interface SoftDeleteModel< T extends Omit<mongoose.Document, "delete">, QueryHelpers = {}, DocType = T > extends mongoose.Model<T, QueryHelpers, DocType> { // 覆盖原有delete方法的类型声明,示例修正 delete(conditions: mongoose.FilterQuery<T>, options?: { permanent?: boolean }): Promise<T | null>; // 新增或修改其他需要调整的方法/属性 restore(conditions: mongoose.FilterQuery<T>): Promise<T | null>; } } }
注意事项
- 如果原接口的泛型参数有默认值,必须在扩展时一并声明,保证结构完全匹配。
- 若原接口继承了其他类型(如
mongoose.Model),扩展时也要保持继承关系,避免丢失原有类型特性。 - 确保你的TypeScript配置(
tsconfig.json)包含了这个自定义.d.ts文件的路径,通常通过include字段指定。
内容的提问来源于stack exchange,提问作者Big Biggums
相关产品推荐
相关产品推荐

