2016-06-30 24 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"}); 

感谢詹姆斯·蒙格。