2013-12-12 73 views
4

我最近更新了TypeScript 0.9.5,它现在在编译期间抛出新的错误。TypeScript中的RequireJS模块声明

我使用RequireJS定义了AMD模块,如HERE所述。

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

     ... 
}); 

为RequireJS打字稿定义文件具有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)=> any'和'(... deps:any [])=> any'不兼容。

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

更多信息:

更改声明如下现在编译。

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

     ... 
}); 

但是移动到单个参数对象肯定是向后迈出的一步?这是定义文件还是TypeScript编译器的限制?

回答

4

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

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

它实际上是一个简单得多重现这种情况下:

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

} 

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

}); 

的问题是 - 当你可以电话在argLoving功能与xy在声明或提供它 - 它实际上接受可变参数不会破坏类型安全。

想象一下以下内容:

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

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

} 
argLoving(foo); 

现在是明确argLoving在接受上的参数个数可变的作品,但富仅适用于正好有两个功能。

这就是类型问题。

方式C#解决了,这是很丑陋*(与Func例如),所以如果你正在寻找一个快速&肮脏的修复 - 你可以在你的.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

+0

感谢您的解释,更加清晰了。但是我不确定你的建议修复是否可以真正应用于RequireJS定义文件。对一个方法所需的参数数量施加上限是可以接受的(如果你有> x你做错了什么)。考虑到模块化现在受到鼓励,限制模块可能需要的“依赖性”数量可能会更难以证明。 –

+0

@BrettPostin你是对的,你真正想说的是,第一个传递的数组需要和函数获得约束的可变参数的长度相同。这是这里的实际限制,你不能用TypeScript(还)来表达。尽管如此,C#在1到31个参数中使用了“Func”和“Action”已经有相当长的一段时间了,它们都被广泛使用,并且投诉级别非常低。你实际上是否有任何超过31个约束的模块?就像我说的 - 我同意这是有问题的,但它也是非常实用的。 –

+0

这对我们来说不会有问题,但由于定义文件是社区驱动的项目,因此RequireJS世界中的某个人可能会!我将把它作为[GitHub](https://github.com/borisyankov/DefinitelyTyped/tree/master/requirejs)上的问题提交。 –

1

讨论对于采取任何和返回任何新的推荐语法是函数的定义:

function require(fn: Function){ 

}