純粋な Javascript で記述された宣言ファイルとサードパーティ ライブラリに関しては、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
私が知る限り、インポート ステートメントには実際の TypeScript クラスが存在する必要があり、参照ステートメントは、コンパイラがそれを処理する方法を理解するのに十分ではありません。
に変えてみました
import ns = module("./test.d");
しかし、サイコロもありません。
これを実際にコンパイルして実行する唯一の方法は、次のように import の代わりに require ステートメントを使用することです。
$ 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
...