【问题标题】:Can Typescript consume Existing AMD's?Typescript 可以使用现有的 AMD 吗?
【发布时间】:2012-10-25 16:49:32
【问题描述】:

Dojo 1.8 已经定义了 AMD 模块。例如,您可以这样做:

require(["dojo/_base/lang"], function (lang) {
  var ab = lang.mixin({a: 1}, {b: 2});
});

但是当我尝试导入这个模块时如何避免出错呢?

import lang = module ("dojo/_base/lang");

有可能吗?

【问题讨论】:

    标签: dojo typescript js-amd


    【解决方案1】:

    您将需要一个用于 lang 的 typescript 定义文件。假设lang.d.tslang.js在同一目录下,这段代码:

    import lang = module('dojo/_base/lang')
    
    var ab = lang.mixin({a: 1}, {b: 2});
    

    编译

    tsc --module amd yourfile.ts
    

    生成

    define(["require", "exports", 'dojo/_base/lang'], function(require, exports, __lang__) {
        var lang = __lang__;
        var ab = lang.mixin({a: 1}, {b: 2});
    }
    

    如果您不想因任何原因匹配目录结构,请改为这样做。假设 lang.d.ts 位于名为 3rd 的子目录中,它是 test.ts 的兄弟。

    test.ts:

    ///<reference path="3rd/lang.d.ts"/>
    import lang = module('dojo/_base/lang');
    var ab = lang.mixin({a: 1}, {b: 2});
    

    3rd/lang.d.ts:

    declare module 'dojo/_base/lang' {
    ...
    }
    

    生成与上面相同的内容。

    【讨论】:

    • 这行得通...但是如果它是具有构造函数的dojo/store/Memory 呢?无法导出构造函数,因此它需要包含在类定义中(我猜)。然后 import Memory = module("dojo/store/Memory") 需要 Memory.Memory() 而不是 Memory()。你能充实一个 Memory.d.ts 来包含构造函数吗?
    • 注意:您可以使用无名函数导出构造函数。
    【解决方案2】:

    您可以通过dojo loader正常加载模块,您不必使用import语句。但是如果你想你必须声明模块:

    declare module "dojo/_base/lang" {
      export function ...
      export class ...
    }
    

    【讨论】:

    • 我知道我可以按照我在问题中显示的相同方式加载模块,但是我将如何从 typescript 执行此操作,以便它出现在生成的 js 的外部要求中?
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2016-02-21
    • 2016-08-11
    • 2023-03-30
    相关资源
    最近更新 更多