2017-01-31 65 views
4

我儘量使測井服務爲我的打字稿/角2應用程序。不幸的是,如果我打電話給console.log行號是錯誤的。即使我嘗試return console.log()飼養的console.log()行號/角2

這裏是我的代碼:

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

您可以使用.bind() method綁定window.console您的自定義日誌方法,然後,這樣,當它被稱爲代碼是在原有範圍內執行返回的功能。

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

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

然後,如果你想在你的條件語句添加:

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

這裏是an example

在這樣做時,行號會被調用記錄器服務的log方法時保留與編譯的TypeScript代碼。


從上面提到的,如果你想實現的 log方法裏面額外的邏輯,那麼你可以利用一個班輪解決方案

撇開getter將返回並調用綁定到window.consoleconsole.log功能。

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是否有訪問()發送到日誌參數的方法。我想將它們發送到服務器。 – Granga