如何使用TypeScript和Mongoose生成唯一的slug?
解决TypeScript环境下Mongoose Slug插件不兼容问题
方案1:手动补全类型声明(适配无TS支持的插件)
针对mongoose-slug-generator这类未提供TypeScript类型定义的插件,可自行创建类型声明文件:
- 在项目根目录新建
types/mongoose-slug-generator/index.d.ts文件,写入基础类型声明:
declare module 'mongoose-slug-generator' { import { Schema } from 'mongoose'; function slugGenerator(options?: Record<string, any>): (schema: Schema) => void; export = slugGenerator; }
- 修改
tsconfig.json,将自定义类型目录加入typeRoots:
{ "compilerOptions": { "typeRoots": ["./node_modules/@types", "./types"] } }
方案2:自定义Slug生成逻辑(最可靠无依赖)
跳过第三方插件,直接用Mongoose预保存钩子实现Slug生成,完全兼容TS:
import mongoose, { Schema, Document } from 'mongoose'; import slugify from 'slugify'; interface IPost extends Document { title: string; slug: string; } const PostSchema: Schema<IPost> = new Schema({ title: { type: String, required: true }, slug: { type: String, unique: true } }); // 预保存钩子自动生成slug PostSchema.pre<IPost>('save', async function(next) { if (!this.isModified('title')) return next(); // 生成基础slug,支持转小写、过滤特殊字符 this.slug = slugify(this.title, { lower: true, strict: true }); // 处理重复slug:添加时间戳后缀 const existing = await mongoose.model<IPost>('Post').findOne({ slug: this.slug }); if (existing) this.slug = `${this.slug}-${Date.now()}`; next(); }); const Post = mongoose.model<IPost>('Post', PostSchema);
方案3:选用原生支持TS的插件
优先选择自带TypeScript类型定义的Mongoose slug插件,安装时直接使用即可,例如安装带官方类型的插件时,无需额外配置类型:
npm install mongoose-slug-updater npm install @types/mongoose-slug-updater --save-dev
内容的提问来源于stack exchange,提问作者Haythem Hedfi
相关产品推荐
相关产品推荐

