2017-06-20 17 views
1

私は電子アプリケーションを作成しようとしています。 main.tsでは、私はかなり単純なクラス(以下)だと思うものを構築しますが、コンストラクタは実行されません。 readline.createInterface(inputStream)の呼び出しが失敗します。ランタイムでは、fs.createReadStreamへの呼び出しによって返される変数に、「on」という関数があるとは考えられません。TypeScript readline.createInterface例外が発生する

例外これは、それを生成されたコードのブロックである

Uncaught Exception: 
TypeError: Cannot read property 'on' of undefined 
    at new Interface (readline.js:142:10) 
    at Object.exports.createInterface (readline.js:28:10) 
    at new FileMonitor (/Users/mikedice/code/electron-rm/app/FileMonitor.js:13:38) 
    at App.Main.onReady (/Users/mikedice/code/electron-rm/app/Main.js:27:23) 
    at emitTwo (events.js:111:20) 
    at App.emit (events.js:191:7) 

あります。

import readline = require("readline"); 
import fs = require("fs"); 

export class FileMonitor 
{ 
    constructor(public filePath:string){ 
     if (!fs.existsSync(filePath)){ 
      console.log(`file does not exist at path ${filePath}`); 
      return; 
     } 

     var inputStream = fs.createReadStream(filePath); 
     var readInterface = readline.createInterface(inputStream); 

     readInterface.on('line', (val)=>{ 
      // when new lines arrive we can publish an event to listeners 
      console.log(val); 
     }); 
    } 
} 

私は、問題はファイルにfs.createReadStreamがReadStreamオブジェクトを返し/Users/mikedice/code/electron-rm/node_modules/@types/node/index.d.tsとしていることだと思います同じファイルreadline.createInterfaceは、NodeJS.ReadableStreamが必要であり、ランタイムが同じものと予想しても、TypeScriptはこれらの2つのタイプを異なるものと見なします。私は、この特定の問題と一般的に、このタイプの問題に対する修正が何であるか分かりません。言語の型システムがランタイムと矛盾しているようですが、なぜコードが実行されたときにランタイムが問題を解決できないのか分かりません。助言がありますか?

export function createReadStream(path: string | Buffer, options?: { 
    flags?: string; 
    encoding?: string; 
    fd?: number; 
    mode?: number; 
    autoClose?: boolean; 
    start?: number; 
    end?: number; 
}): ReadStream; 

export function createInterface(input: NodeJS.ReadableStream, 
output?: NodeJS.WritableStream, 
completer?: Completer | AsyncCompleter, 
terminal?: boolean): ReadLine; 

答えて

1

あなたのreadline.createInterface()オプションは、プロパティinput.readlineでオブジェクトを渡すために呼び出す変更する必要があります。 createInterface()は、入力および/または出力ストリームが割り当てられているオブジェクトが必要です。

readline.createInterface({input: inputStream}); 
+0

OK got it。あなたの提案はうまくいっていて、これもうまくいきました: readline.createInterface(inputStream、null、null、null); – MikeDice

+1

@MikeDiceこの回答があなたの問題を解決した場合は、緑色のチェックマークをクリックして問題が解決したと判断してください。 – Motti

関連する問題