当类型声明为环境外部模块定义时,如何声明参数类型
How to declare parameter types when type is declared as ambient external module definition
假设你有一个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
(只是让编译器生成它,就像它试图那样),尽管我假设您故意避免这样做。
相关文章:
- 如何为排除无穷大和NaN的数字声明Flow类型
- 处理复杂类型时的声明方法
- javascript中不同类型的变量声明
- 如何查找使用Dojo声明创建的类的类型
- JavaScript函数的类型是在声明函数之前定义的
- 如何在打字稿中声明私有类成员的参数和返回类型
- 如何在打字稿中声明 NPM 的模块公共类型定义
- 声明与 JavaScript 中存在的数据类型同名的类
- 在处理.js中,如何声明对象类型和对象数组
- 我应该如何声明一个函数的返回类型,该函数返回一个没有数据的$q promise
- 使用regex传递语法有效的c++声明/初始化(考虑到它们的数据类型)
- 在JavaScript中通过赋值声明变量类型的好处
- 从流类型中删除标头声明
- 我需要用AJAX Post声明一个结果类型吗
- “脚本类型”和“脚本语言”声明之间的区别
- Javascript:需要澄清一个特定类型的变量声明
- Typescript强类型键值对声明
- 允许使用JSHint进行类型声明
- typesings: JS模块导出类实例的类型声明,带有类的原型
- 当类型声明为环境外部模块定义时,如何声明参数类型