假设您有一个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()
中?
答案 0 :(得分:1)
理想情况下,Durandal .d.ts的编写方式不同(这样您无需导入模块即可访问界面)。
作为一种实用的解决方案,您可以使用--module commonjs
而不是--module amd
来编译文件。 require
调用将被优化掉,您仍然会获得类型信息。
您也可以使用--module amd
进行编译并重写您的代码,以便不显式调用define
(只是让编译器生成它,就像它正在尝试的那样),尽管我假设您已经避免了这是出于故意的原因。