4

我正在尝试在客户端使用带有 angularjs 的打字稿。

我发现如果我使用外部模块,生成的 js 将不会在浏览器中运行。

控制器.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()方法有问题。如何解决?

4

2 回答 2

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) {});
        }
    }
}

RequireJS 与非模块

还有第三种情况,很常见。如果您打算导入不是外部模块的东西(例如 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"
    }
  });
于 2013-01-28T11:17:48.280 回答
1

当您使用 require 时,您断言下划线作为可加载模块导出。这进一步假设您正在使用某种模块加载器系统(TypeScript 当前支持 AMD 和 CommonJS 模块)。由于您没有使用模块系统,并且下划线仅在全局范围内可用,因此您可以使用 /// 引用告诉 TypeScript Underscore 在全局范围内可用。将以下内容放在文件顶部:

/// <reference path="./libs/underscore.d.ts">

你应该很高兴去!

于 2013-01-26T19:51:41.177 回答