我正在尝试在客户端使用带有angularjs的typescript。
我发现如果使用外部模块,生成的js将不会在浏览器中运行。
controllers.ts
/// <reference path="./libs/underscore.d.ts"/>
import _ = module("underscore");
module test {
export class Ctrl {
constructor($scope:any) {
$scope.name = "Freewind";
_.each($scope.name, function(item) {});
}
}
}
生成的js将是:
var _ = require("underscore")
var test;
(function (test) {
var Ctrl = (function () {
function Ctrl($scope) {
$scope.name = "Freewind";
_.each($scope.name, function (item) {
});
}
return Ctrl;
})();
test.Ctrl = Ctrl;
})(test || (test = {}));
哪些无法正常运行。但是,如果我删除了module("underscore")
部分,那就没问题了。
由于我在HTML中添加了underscore.js,我认为require()
方法应该有问题。如何解决?
答案 0 :(得分:5)
有两种方法可以在HTML页面中加载内容。
第一个是手动包含页面中的所有脚本文件。您可能会运行某种预发布步骤来合并和缩小代码 - 但是您要对此负责,而不是将其留给代码来执行。这通常称为捆绑。
在捆绑的情况下,您只使用TypeScript代码中的引用(而不是导入),如下所示:
/// <reference path="./libs/underscore.d.ts"/>
module test {
export class Ctrl {
constructor($scope:any) {
$scope.name = "Freewind";
_.each($scope.name, function(item) {});
}
}
}
如果要使用模块加载器(对于Web通常为RequireJS),可以使用import语句加载外部模块。通常在这种情况下你不需要参考......
import _ = module("./libs/underscore");
module test {
export class Ctrl {
constructor($scope:any) {
$scope.name = "Freewind";
_.each($scope.name, function(item) {});
}
}
}
还有第三种情况,这很常见。如果您打算import something that isn't an External Module(例如jQuery,但下划线也可能适合此模式),最好使用对RequireJS的引用和手动调用。
RequireJS会为你加载依赖项,所以你要用它包装你的主程序(可能在一个单独的文件中,如app.ts
。
///<reference path="./libs/require.d.ts" />
///<reference path="./libs/underscore.d.ts" />
module test {
export class Ctrl {
constructor($scope:any) {
$scope.name = "Freewind";
_.each($scope.name, function(item) {});
}
}
}
require(['underscore'], function (_) {
var ctrl = new test.Crtl({});
});
您还可以使用require.config
在应用程序中指定下划线的路径。
require.config({
paths: {
"underscore": "libs/underscore"
}
});
答案 1 :(得分:1)
使用require时,断言下划线作为可加载模块导出。这进一步假设您正在使用某种模块加载器系统(TypeScript目前支持AMD和CommonJS模块)。由于您没有使用模块系统,并且下划线仅在全局范围内可用,因此您可以使用///引用来告诉TypeScript Underscore在全局范围内可用。将以下内容放在文件的顶部:
/// <reference path="./libs/underscore.d.ts">
你应该好好去!