2016-06-30 19 views
2

在我使用的是所謂的第三方庫bunyan像這樣我的打字稿代碼:打字稿:避免需要在報表編譯的JavaScript

private logger: bunyan.Logger = bunyan.createLogger({name: "MyClass"}); 

因爲打字稿無法解析變量bunyan,我這樣做是爲了使打字稿編譯器的工作:

import * as bunyan from "bunyan"; 

不幸的是這會導致下面的JavaScript輸出:

var bunyan = require("bunyan"); 

require語句在瀏覽器中不起作用(當不使用requirejs實現時),因此我將收到:Uncaught ReferenceError: require is not defined

其實我不需要require聲明在我編譯的JavaScript中,因爲我可以使用瀏覽器的bunyan.min.js(browserified版本)。但是如何避免在我的TypeScript代碼中輸入bunyan而不讓TypeScript編譯器抱怨未知引用?

我用的打字稿1.8,這是我的打字稿編譯器配置:

tsconfig.json

{ 
    "compilerOptions": { 
    "module": "commonjs", 
    "moduleResolution": "node", 
    "noEmitOnError": true, 
    "noImplicitAny": false, 
    "removeComments": true, 
    "target": "es5" 
    }, 
    "exclude": [ 
    "node_modules", 
    "typings/browser", 
    "typings/browser.d.ts" 
    ] 
} 

回答

2

您應該使用declare派發bunyan模塊與LoggercreateLogger

declare module bunyan { 
    export interface Logger { 
     info(message: string): any; 
     warn(message: string): any; 
    } 

    export function createLogger(options: any): Logger; 
}; 

class MyClass { 
    private logger: bunyan.Logger = bunyan.createLogger({name: "MyClass"}); 
} 

我會建議使用像the one found here一個分型聲明文件,所以你得到的打字稿:)

+0

感謝您的快速回答。但是如果我這樣做,我會得到'錯誤TS2503:找不到命名空間'bunyan''。 –

+0

我的錯誤@BennyNeugebauer。我已經更新了我的答案:) –

+0

謝謝,詹姆斯!我會試試看!我真的需要將bunyan的每個方法聲明爲接口方法,還是可以使用它的'index.d.ts'文件? –

1

我發現有一些發揮作用的兩件事情的全部優點:

  1. 包裝參考
  2. 型號聲明

說明

在我最初的代碼中,我導入了bunyan,它幫助TypeScript編譯器查找bunyan的聲明。隨着private logger: bunyan.Logger的分配,我還強制在我的logger變量上輸入安全類型。

爲了擺脫bunyan參考(也擺脫編譯的var bunyan = require("bunyan");代碼)我需要欺騙編譯器。

TS編譯器可以通過刪除import並告訴TypeScript在野外有一些名爲bunyan的東西(any)而被欺騙。這可以通過書面形式完成:

declare var bunyan: any;

因爲TS編譯器被欺騙是沒有辦法爲它保證類型安全了,所以需要從logger變量的具體類型被刪除,它的聲明必須看起來像下面的語句:

private logger: any = bunyan.createLogger({name: "MyClass"});

這給我們帶來了以下解決方案:

爲明確告知我以前

// Package reference 
import * as bunyan from "bunyan"; 

// Type declaration 
private logger: bunyan.Logger = bunyan.createLogger({name: "MyClass"}); 

// Package reference 
declare var bunyan: any; 

// Type declaration 
private logger: any = bunyan.createLogger({name: "MyClass"}); 

感謝詹姆斯·蒙格。