首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否自动在Typescript AMD模块中包含AMD deps?

是否自动在Typescript AMD模块中包含AMD deps?
EN

Stack Overflow用户
提问于 2012-12-12 14:12:40
回答 3查看 4.6K关注 0票数 8

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

代码语言:javascript
复制
tsc --module AMD example.ts

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

代码语言:javascript
复制
///<reference path='./lib/knockout-2.2.d.ts' />

export declare var $;
export declare var _;

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

但是,生成的模块不包括以下内容:

代码语言:javascript
复制
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模块:

代码语言:javascript
复制
var $ = import('jquery'); // This is a requirejs/AMD module, not a typescript file.

但我不知道这有多可行。

编辑:

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

代码语言:javascript
复制
import knockout = module("./lib/knockout-2.2.d.ts");
...

但会出现以下编译器错误:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-06 23:16:47

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

示例(恰好是jQuery)

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

步骤2:代码如下(引用注释在Visual Studio中不是必需的):

代码语言:javascript
复制
/// <reference path="scripts/typings/jquery/jquery.d.ts" />

import $ = require('jquery');

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

生成的JavaScript:

代码语言:javascript
复制
define(["require", "exports", 'jquery'], function(require, exports, $) {
    (function (foo) {
        var elem = $('#myid');
    })(exports.foo || (exports.foo = {}));
    var foo = exports.foo;
});

淘汰赛

有些人在使用Knockout时遇到麻烦。同样的技术也适用于Knockout...

代码语言:javascript
复制
/// <reference path="scripts/typings/knockout/knockout.d.ts" />

import ko = require('knockout');

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

生成的JavaScript:

代码语言:javascript
复制
define(["require", "exports", 'knockout'], function(require, exports, ko) {
    (function (foo) {
        var n = ko.observable('example');
    })(exports.foo || (exports.foo = {}));
    var foo = exports.foo;
});
票数 3
EN

Stack Overflow用户

发布于 2012-12-13 01:52:20

这一点:

代码语言:javascript
复制
declare module 'jquery' { export var n; };

import $ = module('jquery');

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

将导致正确的define调用:

代码语言:javascript
复制
define(["require", "exports", 'jquery'], ...

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-30 18:45:59

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

要克服这一点,您可能需要尝试更改声明,如下所示:

代码语言:javascript
复制
declare module 'knockout' { export = knockout; }

我没有使用knockout进行测试,但是解决方案应该也可以使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13833875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档