【发布时间】:2014-05-02 12:07:40
【问题描述】:
我是 TypeScript 的新手,正在尝试将它与 AngularJS 一起使用。这是一个困扰我的情况,因为我无法从编译器中得到错误。
在 Angular (AFAIK) 中,资源提供者有一个 get() 方法,它返回一个 T 的实例,T 是一个类型参数。此方法有许多其他重载,并且可以接受 params 或 data 参数,并可能接受带有如下签名的成功和错误处理程序:
interface IResourceSuccessCallbackFunction<T> {
(value: T, responseHeaders: Array<string>): void;
}
interface IResourceErrorCallbackFunction {
(httpResponse: string): void;
}
我从 corresponding declaration file at DefinitelyTyped 中获得灵感,为 get 函数提出了这些重载:
interface IResourceClass<T> {
get(): T;
get(dataOrParams: any): T;
get(dataOrParams: any, success: IResourceSuccessCallbackFunction<T>): T;
get(success: IResourceSuccessCallbackFunction<T>, error?: IResourceErrorCallbackFunction): T;
get(params: any, data: any, success?: IResourceSuccessCallbackFunction<T>, error?: IResourceErrorCallbackFunction): T;
}
我的问题是这些定义允许我写这样的东西:
var resourceService: IResourceClass<number> = null;
var res1 = resourceService.get({ id: 1000 }, function() {
console.log("fail");
});
var res2 = resourceService.get(function(p: Phone) {
console.log(p);
}, function() {
console.log("fail");
});
显然,对于res1,程序员犯了一个错误,将错误处理程序作为第二个参数传递,忘记了成功处理程序;对于res2,假定的成功处理程序接受错误的类型Phone 而不是number。
现在,我知道为什么这两个调用会编译并且是有效的:最后一个重载版本总是匹配的,因为它允许两个 any 参数和两个可选参数,这里不存在。所以我正在寻找一种方法来定义可以捕获这些错误的重载变体。例如,将 any 替换为“不是函数”的类型,或者使用其他技巧。
这可能吗?
【问题讨论】:
-
您希望在编译时捕获这些错误,对吧?你绝对是对的,
any太放纵了。 -
是的,我想在编译时得到这些错误。
标签: angularjs typescript overloading