2

このタイプスクリプト:

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 つの後ろに移動するだけで、エラーが消えるはずです。インターフェイスには直接的な同等物がなく、コンパイラによって削除されるだけなので、列挙型をインターフェイスの背後に移動するだけでは不十分です。

4

3 に答える 3

6

require()これは、ここで説明したのと同じ問題だと思います。これは、ステートメントの後にセミコロンがないことが原因であることが判明しました。

動作しない Typescript 生成 JavaScript

別のコンパイル済みファイルにこのような行はありますか?

var UID = require('UID')

その場合は、最後にセミコロンを追加してみてください。

var UID = require('UID');

これは TypeScript のバグのようです。ここにバグレポートがあります (投票してください!): http://typescript.codeplex.com/workitem/364

于 2013-03-06T17:26:57.630 に答える
0

私は試してみましたが、同じ問題があります - 欠落しているexports変数は、モジュールをロードするために使用される JavaScript コードによって生成される必要があると思います。

import XXXX = module("XXXX");

この JavaScript を生成します。

var XXXX = require("./XXXX")

Matt B. の言うことは正しいと思います。問題は の後にセミコロンがないrequire()ことです。

修正は、列挙宣言をモジュールに配置することです。

module Test {

    export enum UID {
      FACTORY,
      ROBOT
    }

}

それは生成します:

var test;
(function (test) {
    (function (UID) {
        UID._map = [];
        UID._map[0] = "FACTORY";
        UID.FACTORY = 0;
        UID._map[1] = "ROBOT";
        UID.ROBOT = 1;
    })(test.UID || (test.UID = {}));
    var UID = test.UID;
})(test || (test = {}));

このようにして、exports変数は不要になります。

于 2013-03-06T17:51:36.940 に答える
0

あなたのJavascriptでは、次のようなものが必要です

var exports = exports || {};

(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;
于 2013-03-06T17:15:55.573 に答える