5

我从使用 Visual Studio 2012 Ultimate 的 TypeScript 开始。我已经更改了我的 MSBuild,包括编译器命令中的 --module amd 标记。编译器开始生成 AMD 模块。

我在我的项目 RequireJS 中包含了来自 Nuget Packages 的内容,并在我的主 HTML 中包含了这一行:

<script type="text/javascript" data-main="scripts/SiteMaster"  src="scripts/require.min.js"></script>

我有两个模块 SiteMaster 和 Authenticate。SiteMaster 模块很简单:

export module SiteMaster {
    import auth = module("Authenticate");
    auth.Authenticate.run();
}

它只是导入 Authenticate 模块并调用函数 run()。SiteMaster的js是这样的:

define(["require", "exports"], function(require, exports) {
(function (SiteMaster) {
    var auth = __auth__;

    auth.Authenticate.run();
})(exports.SiteMaster || (exports.SiteMaster = {}));

})

问题是,当我浏览解决方案时,我收到错误:

Microsoft JScript runtime error: '__auth__' is undefined

我怎么解决这个问题 ???

提前致谢。

4

2 回答 2

5

感谢您提出这个 mvbaffa!

如果您将 SiteMaster.ts 更改为:

import auth = module("Authenticate");
export module SiteMaster {
    auth.Authenticate.run();
}

通过将 import 语句移出模块声明,它将生成正确的 js 代码。我将在 TypeScript codeplex 网站上打开一个错误并确保它得到修复。如果这对您来说是一个阻塞问题,您可以在当前编译器 [v0.8] 上执行解决方法。

于 2012-10-06T21:51:17.967 回答
4

我非常确信这是编译器中的错误。我已使用以下源文件重现了该问题:

验证.ts

export var Authenticate = { 
    run : function() {
        console.log("Run!");
    }
}

站点管理员.ts

export module SiteMaster {
    import auth = module("Authenticate");
    auth.Authenticate.run();
}

测试.html

<html>
    <head>
        <script type="text/javascript" data-main="SiteMaster"  src="http://requirejs.org/docs/release/2.1.0/minified/require.js"></script>
    </head>
    <body>
        <p>Test</p>
    </body>
</html>

我使用编译打字稿

tsc --module amd SiteMaster.ts Authenticate.ts

当我test.html在 Firefox 中使用 Firebug 打开时,出现以下错误:

ReferenceError: __auth__ is not defined
var auth = __auth__;

编译后的代码SiteMaster.js如下:

define(["require", "exports"], function(require, exports) {
    (function (SiteMaster) {
        var auth = __auth__;

        auth.Authenticate.run();
    })(exports.SiteMaster || (exports.SiteMaster = {}));

})

从 TypeScript 的语言规范第9.4.3 AMD 模块部分来看,我预计会出现以下情况:

define(["require", "exports", "authenticate"], function(require, exports, authenticateModule) {
    (function (SiteMaster) {
        var auth = authenticateModule;

        auth.Authenticate.run();
    })(exports.SiteMaster || (exports.SiteMaster = {}));

})

这与语言规范中的示例一致。如果其他人同意,我们可能会向 TypeScript 团队提交一个错误。

于 2012-10-06T20:10:18.687 回答