TypeScript中的RequireJS模块声明

时间:2013-12-12 10:39:03

标签: requirejs typescript

我最近更新了TypeScript 0.9.5,它现在在编译过程中引发了新的错误。

我正在使用RequireJS定义一个AMD模块,如HERE所示。

define('myModule', [
    'angular',
    'config'
    ], function (angular, config) {
        'use strict';

        ...
});

RequireJS的TypeScript定义文件具有RequireDefine的以下定义:

/**
* Define a module with a name and dependencies.
* @param name The name of the module.
* @param deps List of dependencies module IDs.
* @param ready Callback function when the dependencies are loaded.
*   callback deps module dependencies
*   callback return module definition
**/
(name: string, deps: string[], ready: (...deps: any[]) => any): void;

但是我收到以下错误:

error TS2082: Build: Supplied parameters do not match any signature of call target:
error TS2087: Build: Could not select overload for 'call' expression.

智能感知错误说明:

调用类型的签名'(angular:any,config:any)=>任何'和'(... deps:any [])=>任何'都是不相容的。

定义文件不正确吗?我在哪里回调参数错误?

更多信息:

现在将声明更改为以下内容。

define('myModule', [
    'angular',
    'config'
    ], function (...args:any[]) {
        'use strict';

        ...
});

然而,转移到单个参数对象肯定是一个倒退的步骤?这是定义文件或TypeScript编译器的限制吗?

2 个答案:

答案 0 :(得分:4)

  

这是定义文件还是TypeScript编译器的限制?

两者。这是TypeScript编译器的“限制”(引用限制,因为它在此强制执行有效约束),并且可以从定义文件中修复。

重现这种情况实际上要简单得多:

function argLoving(fn: (...deps: any[]) => any){

}

argLoving(function(x,y){ // <- compile error

});

问题是 - 当你声明或提供它时,你可以用xy 调用 argLoving中的函数 - 它必须实际接受varargs不破坏类型安全。

想象一下:

function argLoving(fn: (...deps: any[]) => any){

}
function foo(x:any,y:any){

}
argLoving(foo);

现在它是 clear argLoving正在接受一个函数,该函数对可变数量的参数起作用,但foo仅适用于两个参数。

这就是类型问题。

C#解决这个问题的方式非常难看*(例如Func),所以如果你正在寻找一个快速的&amp;脏修复 - 您可以做的只是在.d.ts文件中定义多个签名:

这当然没有问题:

function argLoving(fn: (x:any) => any)
function argLoving(fn: (x:any,y:any) => any)
function argLoving(fn: (x:any,y:any,z:any) => any)
function argLoving(fn: (x:any,y:any,z:any,a:any) => any)
function argLoving(fn: (...deps: any[]) => any){

}
function foo(x:any,y:any){

}
argLoving(foo); // this compiles now

* http://msdn.microsoft.com/en-us/library/bb534960(v=vs.110).aspx - 查看左侧的所有ActionFunc重载


<强>更新

我在GitHub上打开一个问题后 - DefinitelyTyped的作者提出拉取请求,并使用此处https://github.com/borisyankov/DefinitelyTyped/issues/1434建议的相同修补程序来解决此问题。这里正在讨论https://github.com/borisyankov/DefinitelyTyped/pull/1435

答案 1 :(得分:1)

对于带有任何内容并返回任何内容的函数定义,新推荐的语法是:

function require(fn: Function){

}