Typescript Mongoose报错:类型'{type:StringConstructor;...}'无法赋值为string
错误原因
你遇到的Type '{ type: StringConstructor; required: true; }' is not assignable to type 'string'错误,本质是**BlacklistMongo接口的类型定义和Mongoose Schema的结构不匹配**。
你的Schema里token字段用了对象式配置(包含type和required属性),但BlacklistMongo接口里把token定义成了string类型,TypeScript无法将这两种类型关联起来——因为接口描述的是文档的实际数据结构,而Schema配置是Mongoose的规则定义,两者类型维度不同。
修复步骤
1. 修正BlacklistMongo接口定义
打开../types/blacklist.ts,确保接口和Mongoose文档的实际结构完全对应:
import { ObjectId } from "mongoose"; export interface BlacklistMongo { _id: ObjectId; token: string; // 对应Schema中最终存储的字符串类型 user?: ObjectId; // 可选字段,因为Schema里user未设置required createdAt: Date; // timestamps自动生成的字段 updatedAt: Date; // timestamps自动生成的字段 id?: string; // 对应toJSON转换后添加的id字段 }
2. 确认Schema写法正确性
你的Schema写法本身是正确的,但要注意:Mongoose的字段配置对象({ type: String, required: true })是用来告诉Mongoose如何校验和存储数据的,而TypeScript接口描述的是文档实例的实际数据类型,所以接口里的字段类型必须是Schema最终存储的类型(比如string对应type: String),而不是Schema的配置对象类型。
如果不需要额外校验规则,也可以用简写(但需要required的话还是得用对象写法):
const blacklistSchema: Schema<BlacklistMongo> = new mongoose.Schema({ token: { type: String, required: true }, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }, { timestamps: true });
3. 优化logoutRouter中的类型处理
你的logoutRouter代码基本没问题,但如果实例化模型时还有类型警告,可以用类型断言明确指定:
const addedToken = new blacklist({ token } as BlacklistMongo);
额外说明
Mongoose和TypeScript结合时,核心原则是:TypeScript接口描述的是MongoDB中文档的实际结构,而Schema是Mongoose用来生成模型、校验数据的规则,两者必须一一对应。只要接口字段类型和Schema中type指定的类型一致,就能避免这类类型不匹配错误。
内容的提问来源于stack exchange,提问作者Jo Tang

