このタイプスクリプト:
export enum UID {
FACTORY,
ROBOT
}
この JavaScript にコンパイルされます。
(function (UID) {
UID._map = [];
UID._map[0] = "FACTORY";
UID.FACTORY = 0;
UID._map[1] = "ROBOT";
UID.ROBOT = 1;
})(exports.UID || (exports.UID = {}));
var UID = exports.UID;
私にはコードがかなり不明瞭に見えることを認めなければなりませんが、tsc コンパイラが何をしているかを知っていると信じていました。残念ながら、javascript は実行できません。nodejs は次のように不平を言います。
(関数 (UID) {
^ TypeError: オブジェクトは関数ではありません
at ...
私は何を間違えましたか?
更新: Matt B. が問題を解決しました。これは typescript コンパイラの既知のバグです。tsc は、require ステートメントの後にセミコロンを挿入できません。これにより、奇妙なエラーが発生する可能性があります。コードにセミコロンを手動で追加すると、問題が解決しました。コードプレックスの問題へのリンクは次のとおりです: http://typescript.codeplex.com/workitem/364
更新 2: 同じエラーが発生した場合。不足しているセミコロンを手動で挿入できますが、コンパイルのたびにこれを行う必要があるため、これはあまり快適な解決策ではありません。問題は列挙型でのみ発生することに注意しました。プロジェクトには他にも多くのモジュールがあり、それらのどれもこのエラーを引き起こしていません。明らかに、クラス定義は、その前にセミコロンがないことによって「損なわれる」ことはありません。列挙型の定義をクラス定義の 1 つの後ろに移動するだけで、エラーが消えるはずです。インターフェイスには直接的な同等物がなく、コンパイラによって削除されるだけなので、列挙型をインターフェイスの背後に移動するだけでは不十分です。