UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]
Posted
技术标签:
【中文标题】UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]【英文标题】:UserModel is not assignable to parameter of type Document | nulll [mongoose with Typescript] 【发布时间】:2019-03-31 23:15:29 【问题描述】:Typescript 给我一个错误。该错误是由于 mongoose 期望搜索的承诺将使用 mongoose 文档(在本例中为用户的文档)或“null”来解决。 但是我想访问所有用户的方法,所以我必须指定该函数将用户的模型作为参数。但是这件事导致我出现以下错误:
'(user: UserModel) => Response' 类型的参数不能分配给'(res: Document | null) => void | 类型的参数。回应 | PromiseLike'。
这是代码:
import express, Request, Response from "express";
import User, UserModel from "../../models/User";
// router
const router = express.Router();
// @route GET api/user/username/:username
// @access Public
router.get("/username/:username", (req: Request, res: Response) =>
User.findOne( username: req.params.username )
.then((user: UserModel | null) => res.json(user))
.catch(err => res.json(err));
);
export default router;
这是用户的模型:
import mongoose, Schema, model from "mongoose";
export type UserModel = mongoose.Document &
name: string;
username: string;
email: string;
password: string;
avatar: string;
created_at: Date;
;
export const UserSchema = new Schema(
name:
type: String,
required: true
,
username:
type: String,
required: true,
unique: true
,
email:
type: String,
unique: true
,
password:
type: String,
required: true
,
avatar:
type: String
,
created_at:
type: Date,
default: Date.now
);
export default model("User", UserSchema);
【问题讨论】:
【参考方案1】:model
函数接受集合文档类型的类型参数。 (它信任你;它没有任何方法来验证类型是否正确。)替换:
export default model("User", UserSchema);
与:
export default model<UserModel>("User", UserSchema);
那么对这个集合的所有查询都会产生UserModel
对象。
【讨论】:
嗨@Matt McCutchen,我尝试按照他告诉我的去做,但告诉我“模型model
(作为类型参数)之后插入了<UserModel>
,而不是在它之前(作为类型断言)。
非常感谢@Matt McCutchen,你让我发现了一个新东西,从现在开始我肯定会一直使用它,但直到现在我才能验证 vscode 仍然抱怨承诺可以使用 UserModel 或 null 解决,因此将 UserModel 类型分配给 promise 的结果是错误的。
您是否收到问题中代码的错误,回调写为(user: UserModel | null) => res.json(user)
?如果是这样,它不会给我一个错误,所以请发布一个重现问题的存储库,这样我就可以看到你的整个配置。另一方面,如果您将回调写为(user: UserModel) => ...
,则预期会出现错误:由于null
可能是findOne
的结果,您必须声明它,然后在运行时检查它(这应该会自动将user
的类型缩小到UserModel
),或者禁用strictNullChecks
。
mongoose 声明在回调和 Promise API 之间对我来说看起来是一致的。启用strictNullChecks
后,如果您没有在类型中包含null
,两者都应该给您一个错误。您链接的初始存储库是旧的并且已禁用 strictNullChecks
,因此那里的代码将能够将 null
类型视为不存在。以上是关于UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]的主要内容,如果未能解决你的问题,请参考以下文章
如何在等待中指定 Typescript Mongoose 模型类型