8

有没有办法导入或注释 Typescript 模块,以便在生成 AMD 兼容模块时将外部 AMD 模块自动包含为依赖项?:

tsc --module AMD example.ts

我试图同时包含引用 *.d.ts 文件和导出声明语句:

///<reference path='./lib/knockout-2.2.d.ts' />

export declare var $;
export declare var _;

export module example {
    export class Example {
        // whatever
    }
}

但是生成的模块不包括这些:

define(["require", "exports"], function(require, exports) {
    (function (example) {
        var Example = (function () {
            function Example() { }
            return Example;
        })();
        example.Example = Example;        
    })(exports.example || (exports.example = {}));
    var example = exports.example;
})

真的很想避免在这里创建“假”模块。

这似乎是一个不错的解决方案,并且允许直接导入 AMD 模块:

var $ = import('jquery'); // This is a requirejs/AMD module, not a typescript file.

但我不知道这有多可行。

编辑:

而且我也尝试过这里提到的这种方法:Import TypeScript module using only environment definition for use in amd

import knockout = module("./lib/knockout-2.2.d.ts");
...

但得到这些编译器错误:

example.ts(1,32): The name '"./lib/knockout-2.2.d.ts"' does not exist in the current scope
example.ts(1,32): A module cannot be aliased to a non-module type
4

3 回答 3

4

这:

declare module 'jquery' { export var n; };

import $ = module('jquery');

export module foo {
    var n = $.n;
}

将导致正确的define调用:

define(["require", "exports", 'jquery'], ...

请注意,如果您不在位置(而不是仅在类型位置)使用导入的值($在此示例中),编译器将优化该依赖关系。

于 2012-12-12T17:52:20.157 回答
3

在最新版本的 TypeScript 中,正确的方法是......

示例(恰好是 jQuery)

第一步:从 NuGet 下载定义文件(即 jquery.typescript)

第 2 步:这是代码(Visual Studio 中不需要参考注释):

/// <reference path="scripts/typings/jquery/jquery.d.ts" />

import $ = require('jquery');

export module foo {
    var elem = $('#myid');
}

生成的 JavaScript:

define(["require", "exports", 'jquery'], function(require, exports, $) {
    (function (foo) {
        var elem = $('#myid');
    })(exports.foo || (exports.foo = {}));
    var foo = exports.foo;
});

昏死

有些人在使用 Knockout 时遇到问题......同样的技术适用于 Knockout......

/// <reference path="scripts/typings/knockout/knockout.d.ts" />

import ko = require('knockout');

export module foo {
    var obs = ko.observable('example');
}

生成的 JavaScript:

define(["require", "exports", 'knockout'], function(require, exports, ko) {
    (function (foo) {
        var n = ko.observable('example');
    })(exports.foo || (exports.foo = {}));
    var foo = exports.foo;
});
于 2015-01-06T15:16:46.730 回答
0

Ryan 的回答有效,只是新声明隐藏了三重注释“.d.ts”文件中引用的类型。

为了克服这个问题,您可能想尝试像这样更改声明:

declare module 'knockout' { export = knockout; }

我没有用淘汰赛进行测试,但解决方案也应该适用。

于 2013-07-30T10:45:58.903 回答