我尝试使用带有TypeScript的节点的bcrypt模块等待/异步选项。 compare
代码非常简单:
let compare = util.asyncWrap( bcrypt.compare );
let result = await compare( password, stored );
return result;
当我通过TypeScript编译器运行时,它说:
错误TS2322:键入' {}'不能分配给'布尔'。
好吧,公平地说,它不知道来自compare
的已解析值将是一个布尔值。问题是,我该怎么说呢?只需将:boolean
添加到result
对象即可移动错误。
这是我的asyncWrap
功能:
export default function asyncWrap( fn ) {
return function (...args) {
return new Promise( function ( resolve, reject ) {
// Assume the callback handler goes at the end of the arguments
args.push( function( err, val ) {
// Assume that err is the first argument and value is the second
if ( err ) {
reject( err );
}
else {
resolve( val );
}
} );
fn.apply( fn, args );
} );
}
}
我应该注意到,我知道我可以使用npm的bcrypt版本,但是,我刚刚开始使用TypeScript,并希望了解这是如何工作的。
答案 0 :(得分:1)
在代码中没有指定操作的返回值是布尔值,因此编译器无法推断出。
这应该可以解决问题:
return new Promise<boolean>(function(resolve, reject) {
...
});
答案 1 :(得分:0)
根据Nitzan的说法,你可以use Generics来做这件事:
util.asyncWrap<boolean>( bcrypt.compare );
asyncWrap
成为:
export default function asyncWrap<T>( fn: Function ): Function {
return function (...args): Promise<T> {
return new Promise<T>( function ( resolve: Function, reject: Function ) {
// Assume the callback handler goes at the end of the arguments
args.push( function( err: Object, val: any ) {
// Assume that err is the first argument and value is the second
if ( err ) {
reject( err );
}
else {
resolve( val );
}
} );
fn.apply( fn, args );
} );
};
}