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

Javascript 当类型声明为环境外部模块定义时,如何声明参数类型,javascript,requirejs,typescript,durandal,Javascript,Requirejs,Typescript,Durandal,假设您有一个如下所示的ViewModel(或其他RequireJS模块): define(['plugins/dialog'], function (dialog: /* what type should go here? */) { /* rest of module */ } define(["require", "exports"], function(require, exports) { define([ /* rest of module */ })

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

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

/* rest of module */

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

    /* rest of module */

    });
});
作为参考,我们感兴趣的类型是
对话框
界面,其定义如下:

这在编译时起作用,但生成的JavaScript现在如下所示:

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

/* rest of module */

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

    /* rest of module */

    });
});
您可以看到模块被包装在一个额外的“
define()
”调用中。当您尝试显示该对话框时(即Durandal尝试检索该模块时),这将导致出现错误


因此,是否有可能“导入”并使用环境外部模块声明中的类型,而无需将文件包装在额外的
define()

理想情况下,Durandal.d.ts的编写方式会有所不同(这样您就可以访问接口而无需导入模块)

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


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

切换到CommmonJS为我修复了它。我不完全确定所有的含义,因为我在项目的其余部分广泛使用了RequireJS(AMD)。你能再详细一点吗?这是一个正在缓慢迁移到TypeScript的大型现有项目。我们只是将文件重命名为.ts,并在继续开发时添加类型信息。这允许我们慢慢地“插入”类型信息,并允许TypeScript编译器捕获越来越多的问题。