包装方法的返回类型规范(TypeScript)

时间:2016-09-20 11:07:03

标签: node.js asynchronous typescript bcrypt

我尝试使用带有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,并希望了解这是如何工作的。

2 个答案:

答案 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 );
        } );
    };
}