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

How to declare parameter types when type is declared as ambient external module definition

本文关键字:类型 声明 何声明 参数 定义 环境 外部 模块      更新时间:2023-09-26

假设你有一个ViewModel(或其他RequireJS模块),看起来像这样:

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

作为参考,我们感兴趣的类型是Dialog接口,它在durandal. d.s:

中定义如下:
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()"调用中。当您尝试显示对话框时(即,当Durandal试图检索此模块时),这会导致不匹配的匿名定义错误。

那么,是否有可能"导入"并使用环境外部模块声明中的类型,而不需要将文件包装在额外的define()中?

理想情况下,Durandal .d。t将以不同的方式编写(这样您就可以在不导入模块的情况下访问接口)。

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

您也可以使用--module amd进行编译并重写代码以不显式调用define(只是让编译器生成它,就像它试图那样),尽管我假设您故意避免这样做。