Typescript & Mongoose - "this" 在实例方法中不可用

Posted

技术标签:

【中文标题】Typescript & Mongoose - "this" 在实例方法中不可用【英文标题】:Typescript & Mongoose - "this" not available in instance methods 【发布时间】:2021-04-18 15:11:39 【问题描述】:

我目前正在将我的 API 从 JS 转换为 TS。但是,我在使用猫鼬和打字稿时遇到了一些困难。具体来说,this 在我的实例方法中不可用。

我的代码:

AccountSchema.methods.comparePassword = async function (candidatePassword: string) 
  const isMatch = await bcrypt.compare(candidatePassword, this.password);
  return isMatch;
;

这会产生以下错误,因为this 指的是函数而不是实际文档:

“函数”类型的参数不能分配给“字符串”类型的参数。

但是,根据Mongoose's documentation,应该不会有错误,因为this 应该参考实际文档。

这实际上指的是什么:

this: 
    [name: string]: Function;

我如何定义我的架构:

const AccountSchema = new mongoose.Schema<IAccount>(...)

我的方法适用于 JS,所以我知道它与 TypeScript 有关。 Mongoose documentation 确认我的实现是定义实例方法的正确方法,所以我很困惑为什么它不起作用。

是否有一种我不知道的在 mongoose 中声明和使用实例方法的特定 TS 方式?

任何帮助将不胜感激!

【问题讨论】:

“'Function' 类型的参数不能分配给'string' 类型的参数。” 非常清楚地告诉你你正在传递一个函数,其中需要一个字符串.错误的依据是什么?你调用的函数/方法的定义是什么?论据的定义是什么? 可以试试简写。AccountSchema.methods.comparePassword = async (candidatePassword: string): boolean => const isMatch = await bcrypt.compare(candidatePassword, this.password);返回是匹配; ; @T.J.Crowder 首先不应该出现这样的错误,因为根据 Mongoose 的文档,“this”应该指的是实际文档而不是函数 @user906573 不起作用,因为它会阻止它被绑定(根据 Mongoose 的文档。我收到一条错误消息,“this”可能未定义。 @T.J.Crowder 更新了我的问题,现在应该更清楚了 【参考方案1】:

我所需要的只是该函数的this 参数。这在 TS 中比较特殊,在函数中指定了this 的类型。

像这样:

async function (this: IAccount, candidatePassword: string)  ... 

this 参数未显式传递,因此新参数不会改变函数的调用方式。

【讨论】:

this is a special keyword 在 JS 中。所以我建议使用变量this 并使用其他变量。

以上是关于Typescript & Mongoose - "this" 在实例方法中不可用的主要内容,如果未能解决你的问题,请参考以下文章

如何提取 typescript mongoose/typegoose 模式

Mongoose 和 TypeScript - 类型“事件模型”上不存在属性“_doc”

带有 typescript 和 mongoose 的静态方法会:“一个接口只能扩展一个类或另一个接口。”

使用`let cached = global.mongoose`时出现Next.js + Typescript + mongoose错误

使用 Typescript 从 Mongoose 模型访问文档属性

typescript 使用TypeScript和MongoDb的Mongoose示例