2017-01-31 7 views
4

TypeScript/Angular 2 Appのロギングサービスを作成しようとしています。残念ながら、私がconsole.logを呼び出すと、行番号が間違っています。私が試みてもreturn console.log()。ここでTypeScript/Angular 2のラッパー関数でconsole.log()行番号を保持する

は私のコードです:

LoggerService.ts

export class LoggerService {  
    log(message) { 
    // Server-side logging 
    // [...] 
    if (clientSideLogging) return console.log(message); 
    } 
} 

SomewhereElse.ts

this.logger.log('hello world'); 

- >がLoggerService.tsの行番号を表示しますソースの代わりに

+0

これはタイプコピーのコンパイル時エラーですか? – Aravind

答えて

2

あなたのカスタムログメソッドにwindow.consoleをバインドし、それが呼び出されたときにコードが元のスコープ内で実行されるように、機能を返すために.bind() methodを使用することができます。

class LoggerService { 
    public log = console.log.bind(window.console); 
} 

// ...or annotated: 
class LoggerService { 
    public log: (message) => void = console.log.bind(window.console); 
} 

あなたの条件文に追加したい場合は、::ロガーサービスのlogメソッドを呼び出すときにそうすることで

、行番号が保存されます

class LoggerService { 
    public log = clientSideLogging ? console.log.bind(window.console) :() => {}; 
} 

ここでan exampleコンパイルされたTypeScriptコードを使用します。あなたがlogメソッドの内部で、追加のロジックを実装したい場合は、あなたが利用することができる、上記のワンライナーのソリューションは別に


戻り、 window.consoleにバインドされている console.log関数を呼び出します getter

class LoggerService { 
    public get log(): Function { 
    // Implemnt server-side logging 

    return console.log.bind(window.console); 
    } 
} 

あなたが言うことができるように、それはそれは別のスコープ内で直接呼び出されたとき、それは行番号を保持されませんので、返されるconsole.log機能にとって重要です。その後

あなたの条件文に追加したい場合:ここで

class LoggerService { 
    public get log(): Function { 
    const log = console.log.bind(window.console); 

    // Implemnt server-side logging 

    return clientSideLogging ? log :() => {}; 
    } 
} 

がコンパイル活字体コードでan exampleです。

+0

logger.log(msg)で実行する必要があるサーバー側のログとその他の処理はどうなりますか? – Mick

+0

@Mick - 更新しました。 –

+1

@JoshCrozier log()に送信された引数にアクセスする方法はありますか?私はそれらをサーバーに送りたい。 – Granga

関連する問題