6
當涉及到以純Javascript編寫的聲明文件和第三方庫時,我沒有在TypeScript中獲得這些東西。比方說,我有以下的Javascript類:如何在TypeScript中使用聲明文件
$ 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
從我所知道的情況來看,導入語句需要一個實際的TypeScript類來存在,並且引用語句不足以幫助編譯器找出如何處理它。
我試圖將其更改爲
import ns = module("./test.d");
但沒有骰子無論是。
唯一的辦法我能得到這個實際編譯和運行是使用要求語句,而不是進口的,就像這樣:
$ 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();
}
這段代碼的問題是,打字稿沒有運行任何類型檢查。事實上,我可以完全刪除線
///<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
...