2017-04-18 12 views
6

rxjs 5を使用してNode.jsサーバーをTypeScriptに書き込もうとしましたが、fs.readFileをrxjs形式に変換するとエラーが発生しました。私は'utf-8'TypeScriptのObservable.bindNodeCallback(fs.readFile)からobservableを作成できません

Supplied parameters do not match any signature of call target. 

二番目のパラメータを追加した場合しかし、私のエディタは活字体のエラーを報告し、次のコードは、 に活字体

// This is a JavaScript example from the official documentation. It should 
// also work at the TypeScript envrionment. 

import * as fs from 'fs'; 
import { Observable } from 'rxjs'; 

let readFileAsObservable = Observable.bindNodeCallback(fs.readFile); 

// This is the line that throws the error. 
let result = readFileAsObservable('./roadNames.txt', 'utf8'); 

result.subscribe(x => console.log(x), e => console.error(e)); 

を働くだろう期待して私はfs.readFile()を使用する方法についてのガイドを探してみてくださいrxjsとTypeScriptでは、多くの運がありません。

答えて

9

bindCallbackおよびbindNodeCallbackは、TypeScriptがどのように関数パラメータを推論するかに依存するため、TypeScriptでは扱いにくい場合があります。

もっと良い方法がありますが、これは推測されていることを正確に確認するためです。オブザーバブルを完全に互換性のないものに割り当て、影響を受けるエラーを詳しく見てください。たとえば、この:

const n: number = Observable.bindNodeCallback(fs.readFile); 

は、このエラーに影響されます:

Type '(v1: string) => Observable<Buffer>' is not assignable to type 'number'. 

だから、活字体がreadFileのパスのみの過負荷に一致していることは明らかです。

このような状況では、矢印機能を使用して、使用するオーバーロードを正確に指定することがよくあります。たとえば、この:

const n: number = Observable.bindNodeCallback((
    path: string, 
    encoding: string, 
    callback: (error: Error, buffer: Buffer) => void 
) => fs.readFile(path, encoding, callback)); 

は、このエラーに影響されます:

Type '(v1: string, v2: string) => Observable<Buffer>' is not assignable to type 'number'. 

だから、今必要な過負荷をマッチングだと次のように動作します:

let readFileAsObservable = Observable.bindNodeCallback((
    path: string, 
    encoding: string, 
    callback: (error: Error, buffer: Buffer) => void 
) => fs.readFile(path, encoding, callback)); 

let result = readFileAsObservable('./package.json', 'utf8'); 
result.subscribe(
    buffer => console.log(buffer.toString()), 
    error => console.error(error) 
); 
+0

機能のオーバーロードを実行するうまい方法。ありがとう! –

+0

これは、TypeScriptの性質(間違いなくタイプされている)、またはrxjsの設計上の欠陥の結果として考えてください。 –

+1

私の視点からは、設計上の欠陥ではありません。関数にオーバーロードがある場合、どちらを推測できるかは分かりません。私は、TypeScriptは、パラメータ型を推論するかなり良い仕事をすると思います。矢印関数を使うもう一つの利点は、特定のコンテキストでメソッドを呼び出す必要があるときに 'bind'を使わないようにすることです。 'bind'は' any'を返し、その後TypeScriptの推論はうまく混乱します。 – cartant

1

を正直私の避難所」であると解決策を見つけましたが、それを機能させるために、関数にキャストします。

関連する問題