javascript - Typescript 中的 Promise 函数“类型 void 不可分配……”
问题描述
我刚刚开始使用 Typescript。如果不欺骗 Typescript 系统并使用 type,我似乎无法解决的一个问题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
)
我得到的打字稿错误是:Type 'void' is not assignable to type 'UserDocument'
我的函数声明缺少什么?以及如何使用 Typescript 处理 Promise,以便我可以告诉 TypescriptwinningUser
实际上是类型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'))
})
},
解决方案
请查看this.save()
方法的类型定义,它似乎不返回UserDocument
而是返回void
。
我创建了一个游乐场链接,它表明您的其他类型定义工作正常:链接
推荐阅读
- c++ - 如何在开始时向向量添加元素?
- testng - 如何将测试类分配给测试中的套件
- javascript - cytoscape 是否支持单个节点的多个端口?
- java - 由于弹簧上下文的双重加载,SpringBoot 无法将 bean 注入到 kafkaConumser 中,即在 Spring 托管类之外的类中
- node.js - 如何用 sinon 编写单元测试用例并点击而不打到数据库?
- javascript - 如何更改 ESRI 地图中点的颜色?
- jquery - 如何修复此正则表达式以排除负数
- qt - 如何将鼠标位置转换为行号?
- set - 如何使用具有“通常”相等性的 MSet 创建有限集类型?
- react-native - 如何在反应原生中像ibook一样翻转页面过渡