假设您有一个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;
}
}这种类型的模块定义称为“环境外部模块声明”。正如@basarat所指出的,这里需要使用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 */
});
});您可以看到模块被包装在一个额外的"define()“调用中。当您试图显示对话框时(即,杜兰达尔试图检索此模块时),这将导致不匹配匿名定义错误。
那么,是否可以“导入”并使用环境外部模块声明中的类型,而不必将文件包装在额外的define()中?
发布于 2014-06-13 18:01:14
理想情况下,Durandal .d.ts将以不同的方式编写(这样您就可以在不导入模块的情况下访问接口)。
作为一种实用的解决方案,您可以使用--module commonjs而不是--module amd编译您的文件。require调用将被优化,您仍将获得类型信息。
您还可以使用--module amd进行编译,并重写代码以避免显式调用define (只需让编译器生成define,就像它试图生成的那样),尽管我假设您是出于有意的原因避免这样做的。
https://stackoverflow.com/questions/24211227
复制相似问题