Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺Typescript中的函数;类型void不可分配…“;_Javascript_Typescript_Promise - Fatal编程技术网

Javascript 承诺Typescript中的函数;类型void不可分配…“;

Javascript 承诺Typescript中的函数;类型void不可分配…“;,javascript,typescript,promise,Javascript,Typescript,Promise,我刚刚开始使用Typescript。如果不欺骗Typescript系统并使用anytype,我似乎无法解决以下一个问题: 我有一个函数返回一个承诺: saveExpirableToken(tokenField: string, tokenExpiresField: string, tokenExpiresAt: Date) { return new Promise<UserDocument>((resolve, reject) => { this.gen

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

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

  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())
      })
    })
  },

我得到的Typescript错误是:
类型“void”不能分配给类型“UserDocument”

我的函数声明缺少什么?我如何用Typescript处理承诺,这样我就可以告诉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'))
    })
  },
generateResetToken(回调:(err:Error | null,token?:string)=>Promise){
常数byteSize=16
crypto.randomBytes(字节大小,(err,resetToken)=>{
if(err){callback(err)}
回调(null,resetToken.toString('hex'))
})
},

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


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

这似乎是正确的。他们应该调用
this.save()
(如果是
async
),然后使用
this
进行解析。我专门使用MongoDB和Mongoose。基于这些文档,
document.save()
应该返回一个承诺,该承诺将解析为已保存的文档:。我认为我的问题在于
generateResetToken
的工作方式。我尝试将typescript(请参见编辑)添加到函数中,以表示它将收到一个回调,该回调是一个将向用户文档返回承诺的函数。看起来错误来自
generateResetToken
的类型定义。
回调应不返回任何内容,因此您可能希望将
generateResetToken
的返回类型更改为
void
。再次确认一下,错误指向哪一行?随机用户的类型是什么?能否提供
save
方法的代码
this.save()
意味着调用对象的
save
方法(我猜最终会调用Mongoose提供的
save
  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'))
    })
  },