2016-09-20 13 views
0

TypeScriptのawait/asyncオプションを持つNodeに対してbcryptモジュールを使用しようとしています。 compareコードは非常に簡単です:ラップされたメソッド(型スクリプト)の戻り値の型式

let compare = util.asyncWrap(bcrypt.compare); 
    let result = await compare(password, stored); 
    return result; 

私は活字体コンパイラによってそれが言うことを実行すると:

エラーTS2322を:タイプ「{}」「ブール」型に代入できません。

大丈夫ですが、compareの解決された値がブール値になることはわかりません。問題は、どうすればいいのでしょうか?単に:booleanresultオブジェクトに追加するだけでエラーが移動します。

これは私の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ののpromifiedバージョンを使用することができることを認識しています、しかし、私はちょうど活字体で出始めているとしたいことに注意すべきですこれがどのように機能するのかを理解する。

答えて

1

オペレーションの戻り値がブール値であるため、コンパイラはそれを推論できません。

これはおそらく、トリックを行う必要があります。Nitzanが言ったことに

return new Promise<boolean>(function(resolve, reject) { 
    ... 
}); 
+0

問題を'asyncWrap'関数を使って他の関数をラップすることができるということです文字列やオブジェクトなどの型があります。コードを複製せずに、この特定のケースではブール値でなければならないことを伝える方法はわかりません。 –

0

ビルを、あなたは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); 
     }); 
    }; 
} 
関連する問題