TypeScript:避免编译JavaScript

时间:2016-06-30 15:49:28

标签: import typescript module requirejs commonjs

在我的TypeScript代码中,我正在使用名为bunyan的第三方库,如下所示:

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

因为TypeScript无法解析变量bunyan,所以我这样做是为了让TypeScript编译器工作:

import * as bunyan from "bunyan";

不幸的是,这会导致以下JavaScript输出:

var bunyan = require("bunyan");

require语句在浏览器中不起作用(不使用requirejs实施时),因此我会收到:Uncaught ReferenceError: require is not defined

实际上我在编译的JavaScript中不需要require语句,因为我可以使用bunyan.min.js(浏览器化版本)来浏览器。但是,如果不让TypeScript编译器抱怨未知引用,我怎样才能避免在我的TypeScript代码中使用bunyan导入?

我正在使用TypeScript 1.8,这是我的TypeScript编译器配置:

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 个答案:

答案 0 :(得分:2)

您应declare使用bunyanLoggercreateLogger声明模块。

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这样的打字声明文件,这样你就可以获得TypeScript的全部好处:)

答案 1 :(得分:1)

我发现有两件事情可以发挥作用:

  1. 套餐参考
  2. 类型声明
  3. <强>解释

    在我的初始代码中,我导入了bunyan,这有助于TypeScript编译器找到bunyan的声明。通过private logger: bunyan.Logger的分配,我还强制了logger变量的类型安全性。

    为了摆脱bunyan引用(也摆脱编译的var bunyan = require("bunyan");代码)我需要欺骗编译器。

    可以通过删除import并告诉TypeScript在野外有一些名为any的东西(bunyan)来欺骗TS编译器。这可以通过写:

    来完成

    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"});
    

    感谢James Monger向我明确表示。