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(作为类型参数)之后插入了&lt;UserModel&gt;,而不是在它之前(作为类型断言)。 非常感谢@Matt McCutchen,你让我发现了一个新东西,从现在开始我肯定会一直使用它,但直到现在我才能验证 vscode 仍然抱怨承诺可以使用 UserModel 或 null 解决,因此将 UserModel 类型分配给 promise 的结果是错误的。 您是否收到问题中代码的错误,回调写为(user: UserModel | null) =&gt; res.json(user)?如果是这样,它不会给我一个错误,所以请发布一个重现问题的存储库,这样我就可以看到你的整个配置。另一方面,如果您将回调写为(user: UserModel) =&gt; ...,则预期会出现错误:由于null 可能是findOne 的结果,您必须声明它,然后在运行时检查它(这应该会自动将user 的类型缩小到UserModel),或者禁用strictNullChecks mongoose 声明在回调和 Promise API 之间对我来说看起来是一致的。启用strictNullChecks 后,如果您没有在类型中包含null,两者都应该给您一个错误。您链接的初始存储库是旧的并且已禁用 strictNullChecks,因此那里的代码将能够将 null 类型视为不存在。

以上是关于UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]的主要内容,如果未能解决你的问题,请参考以下文章

如何在等待中指定 Typescript Mongoose 模型类型

打字稿:类型'null'不可分配给类型错误

打字稿错误:类型“文档 []”不可分配给自定义类型

打字稿 - 字符串'不可分配给类型'FC

类型 '() => void' 不可分配给类型 '() => '

类型 '' 不可分配给类型 '() =>