Typegoose:如何将类作为函数参数类型并实现类型检查?
如何将Typegoose定义的类作为函数参数类型
直接使用Typegoose定义的类作为函数参数类型是完全可行的,你代码里authToCheck: Auth的写法本身就能实现类型检查与代码补全——Typegoose的类在TypeScript中本身就是合法类型,TypeScript会根据类中的@prop装饰器自动推断属性类型。
不过你的代码存在异步逻辑处理问题,AuthModel.findOne返回的是Promise对象,无法同步获取结果,同时需要处理查询结果为空的场景,以下是修正后的完整代码:
import { prop, getModelForClass, DocumentType } from '@typegoose/typegoose'; class Auth { @prop({ required: true }) public groupName!: string; @prop({ type: () => [String] }) public rights?: string[]; } export const AuthModel = getModelForClass(Auth); // 改为异步函数,明确返回值类型,同时用DocumentType<Auth>标记查询结果类型 const checkRights = async (authToCheck: Auth): Promise<boolean | undefined> => { const authGroup = await AuthModel.findOne({ groupName: authToCheck.groupName }); // 处理分组不存在的情况 if (!authGroup) { return false; // 可根据业务需求返回undefined或抛出错误 } const allRightsOk = authToCheck.rights?.every(el => authGroup.rights?.includes(el)); return allRightsOk; }
几个关键说明:
DocumentType<Auth>是Typegoose提供的专用类型,用于表示从数据库查询出的文档实例,它包含Auth类的所有属性,同时附带Mongoose文档的原生方法(如save()、toJSON())。如果不需要文档方法,直接用Auth作为查询结果类型也可以,但DocumentType<Auth>的类型描述更准确。- 确保TypeScript配置中开启
strict: true,能最大化利用Typegoose的类型推断能力,避免空值、未定义等潜在问题。 - 如果
authToCheck参数可能是数据库返回的文档实例,也可以将参数类型改为DocumentType<Auth>,它兼容普通Auth对象与数据库文档实例。
内容的提问来源于stack exchange,提问作者crivella
相关产品推荐
相关产品推荐

