当type被声明为环境外部模块定义时,如何声明参数类型

时间:2014-06-13 17:53:50

标签: javascript requirejs typescript durandal

假设您有一个ViewModel(或其他RequireJS模块),如下所示:

define(['plugins/dialog'], function (dialog: /* what type should go here? */) {

/* rest of module */

}

作为参考,我们感兴趣的类型是Dialog接口,在durandal.d.ts中定义如下:

declare module 'plugins/dialog' {
    interface Dialog {
        owner: any;
        context: DialogContext;
        activator: DurandalActivator<any>;
        close(): JQueryPromise<any>;
        settings: composition.CompositionContext;
    }
}

这种类型的模块定义称为&#34; ambient external module declaration。&#34;由于@basarat注意到here,您需要使用import才能访问这些模块。以下是您的ViewModel需要更新的方式:

import dialogModule = require('plugins/dialog');
define(['plugins/dialog'], function (dialog: dialogModule.Dialog) {

/* rest of module */

}

这在编译时有效,但生成的JavaScript现在看起来像这样:

define(["require", "exports"], function(require, exports) {
    define([

    /* rest of module */

    });
});

您可以看到该模块包含在额外的&#34; define()&#34;呼叫。当您尝试显示对话框时(即Durandal尝试检索此模块时),这会产生mismatched anonymous define error

那么,是否可以&#34;导入&#34;并在环境外部模块声明中使用类型,而不是将文件包装在额外的define()中?

1 个答案:

答案 0 :(得分:1)

理想情况下,Durandal .d.ts的编写方式不同(这样您无需导入模块即可访问界面)。

作为一种实用的解决方案,您可以使用--module commonjs而不是--module amd来编译文件。 require调用将被优化掉,您仍然会获得类型信息。

您也可以使用--module amd进行编译并重写您的代码,以便不显式调用define(只是让编译器生成它,就像它正在尝试的那样),尽管我假设您已经避免了这是出于故意的原因。