当涉及到用纯 Javascript 编写的声明文件和 3rd 方库时,我在 TypeScript 中没有得到一些东西。假设我有以下 Javascript 类:
$ cat SomeClass.js
var SomeClass = (function () {
function SomeClass() {
}
SomeClass.prototype.method1 = function () {
return "some string";
};
return SomeClass;
})();
exports.SomeClass = SomeClass;
我想对其进行类型检查,所以我创建了这样的声明文件:
$ 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
据我所知,import 语句需要存在一个实际的 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 没有运行任何类型检查。事实上,我可以完全删除这条线
///<reference path="./test.d.ts"/>
它不会改变任何东西。
但是,如果我删除了 require 语句,我可以进行类型检查,但是代码在运行时会爆炸,因为没有 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
...