我最近更新了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编译器的限制吗?
答案 0 :(得分:4)
这是定义文件还是TypeScript编译器的限制?
两者。这是TypeScript编译器的“限制”(引用限制,因为它在此强制执行有效约束),并且可以从定义文件中修复。
重现这种情况实际上要简单得多:
function argLoving(fn: (...deps: any[]) => any){
}
argLoving(function(x,y){ // <- compile error
});
问题是 - 当你声明或提供它时,你可以用x
和y
调用 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 - 查看左侧的所有Action
和Func
重载
<强>更新强>
我在GitHub上打开一个问题后 - DefinitelyTyped的作者提出拉取请求,并使用此处https://github.com/borisyankov/DefinitelyTyped/issues/1434建议的相同修补程序来解决此问题。这里正在讨论https://github.com/borisyankov/DefinitelyTyped/pull/1435
答案 1 :(得分:1)
对于带有任何内容并返回任何内容的函数定义,新推荐的语法是:
function require(fn: Function){
}