【问题标题】:Promises function in Typescript "type void is not assignable ..."Typescript 中的 Promise 函数“类型 void 不可分配……”
【发布时间】:2021-02-10 02:23:10
【问题描述】:

我刚刚开始使用 Typescript。如果不欺骗 Typescript 系统并使用 any 类型,我似乎无法解决的一个问题如下:

我有一个返回承诺的函数:

  saveExpirableToken(tokenField: string, tokenExpiresField: string, tokenExpiresAt: Date) {
    return new Promise<UserDocument>((resolve, reject) => {
      this.generateResetToken((err: Error, resetToken: string) => {
        if (err) { reject(err) }

        this[tokenField] = resetToken
        this[tokenExpiresField] = tokenExpiresAt
        resolve(this.save())
      })
    })
  },

我在其他地方调用以下

    let winningUser: UserDocument = await randomUser.saveExpirableToken(
      'wonEverythingToken',
      'wonEverythingTokenExpires',
      moment().add(1, 'year').toDate() // add one year as expiration to claiming prize
    )

我得到的 Typescript 错误是:Type 'void' is not assignable to type 'UserDocument'

我的函数声明缺少什么?以及如何使用 Typescript 处理 Promise,以便我可以告诉 Typescript winningUser 实际上是 UserDocument 类型

** 编辑 **

  generateResetToken(callback: (err: Error | null, token?: string) => Promise<UserDocument>) {
    const byteSize = 16
    crypto.randomBytes(byteSize, (err, resetToken) => {
      if (err) { callback(err) }

      callback(null, resetToken.toString('hex'))
    })
  },

【问题讨论】:

    标签: javascript typescript promise


    【解决方案1】:

    请查看this.save()方法的类型定义,它似乎没有返回UserDocument而是返回void

    我创建了一个游乐场链接,它表明您的其他类型定义工作正常:Link

    【讨论】:

    • 这似乎是对的。他们应该调用this.save()(如果是async,则等待它),然后使用this解决。
    • 我专门使用 MongoDB 和 Mongoose。基于这些文档,document.save() 应该返回一个可以解析为已保存文档的承诺:mongoosejs.com/docs/documents.html#updating-using-save
    • 我相信我的问题在于generateResetToken 的工作方式。我试图在函数中添加打字稿(见编辑),说它将接收一个回调函数,该函数将向用户文档返回一个承诺。
    • 看起来错误来自 generateResetToken 的类型定义。 callback 不应返回任何内容,因此您可能需要将 generateResetToken 的返回类型更改为 void。只是为了再次确定,错误指向哪一行?
    • randomUser的类型是什么?能否提供save方法的代码? this.save() 表示调用对象的save 方法(我猜最终会调用Mongoose 提供的save
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2020-07-29
    • 2021-08-05
    • 2021-04-18
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多