如何在TypeScript中使用声明文件
当涉及到用纯Javascript编写的声明文件和第三方库时,我没有在TypeScript中获得这些东西。 假设我有以下Javascript类:
$ cat SomeClass.js var SomeClass = (function () { function SomeClass() { } SomeClass.prototype.method1 = function () { return "some string"; }; return SomeClass; })(); exports.SomeClass = SomeClass;
我想获得types检查,所以我创build了这样的声明文件:
$ cat test.d.ts class SomeClass { public method1(): string; }
然后我想在一些代码中使用类和声明文件:
$ cat main.ts ///<reference path="./test.d.ts"/> import ns = module("./SomeClass"); function test(): string { var sc = new ns.SomeClass(); return sc.method1(); }
当我尝试编译它,我得到这个:
$ tsc main.ts main.ts(2,19): The name '"./SomeClass"' does not exist in the current scope main.ts(2,19): A module cannot be aliased to a non-module type main.ts(5,16): Expected var, class, interface, or module
从我所知道的情况来看,导入语句需要一个实际的TypeScript类来存在,并且引用语句不足以帮助编译器找出如何处理它。
我试图改变它
import ns = module("./test.d");
但也没有骰子。
我能得到这个实际编译和运行的唯一方法是使用require语句而不是import,如下所示:
$ cat main.ts ///<reference path="./node.d.ts"/> ///<reference path="./test.d.ts"/> var ns = require("./SomeClass"); function test(): string { var sc = new ns.SomeClass(); return sc.method1(); }
这个代码的问题是TypeScript没有运行任何types检查。 事实上,我可以完全删除线路
///<reference path="./test.d.ts"/>
它不会改变任何东西。
但是,如果我删除了require语句,则可以进行types检查,但由于没有require语句,因此代码在运行时会爆炸。
$ cat main.ts ///<reference path="./test.d.ts"/> function test(): string { var sc = new SomeClass(); return sc.method1(); } test(); $ node main.js main.js:2 var sc = new SomeClass(); ^ ReferenceError: SomeClass is not defined ...
猫testing
declare module "SomeClass.js" { class SomeClass { method1(): string; } }
猫Main.ts
///<reference path="test.d.ts"/> import ns = module("SomeClass.js"); function test() { var sc = new ns.SomeClass(); return sc.method1(); }
tsc Main.ts – 声明
猫Main.js
var ns = require("SomeClass.js") function test() { var sc = new ns.SomeClass(); return sc.method1(); }
猫Main.d.ts
import ns = module ("SomeClass.js"); function test(): string;