在我的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"
]
}
答案 0 :(得分:2)
您应declare
使用bunyan
和Logger
为createLogger
声明模块。
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)
我发现有两件事情可以发挥作用:
<强>解释强>
在我的初始代码中,我导入了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向我明确表示。