打字稿:如何定义重载函数类型

阿卜杜勒·卡里姆

我为函数重载创建了以下接口

interface IRequestObservableDelegate {
    (url: string | Request, options?: RequestOptionsArgs): Observable<Response>;
    (url: string | Request, body?: string, options?: RequestOptionsArgs): Observable<Response>;
}

我的想法是将接口上面类型的函数传递给另一个函数

function DoSomething(cb:IRequestObservableDelegate,someCondition:boolean):void;

以下代码有效

const f1 = (u,o) => obsrevable; // dummy function
DoSomething(f1,somecond);

但这不起作用

const f2 = (u,b,o) => obsrevable; // dummy function
DoSomething(f2,somecond);

任何想法如何定义重载函数类型

邓肯

当您在接口中提供多个调用签名时,您尝试分配给该接口的任何内容都必须与所有调用签名匹配。您的分配f2与第一个签名不匹配,因为它有一个额外的参数,因此您无法使用它。

这实际上是有道理的,因为任何使用实现接口的对象的代码都可能使用第一个签名调用该函数,f2并且不知道如何处理这些调用。

你可能会做的是定义两个单独的接口,一个用于每个签名,然后一个类型IRequestObservableDelegate是这两个接口的联合。然后f1f2每个都被定义为持有相关的受限接口,但仍然可以传递给接受联合接口的函数。这当然意味着使用联合接口的代码必须对回调函数的类型进行断言,以便在调用它时不会失去类型安全性。

interface IRequestSimpleObservableDelegate {
    (url: string | Request, options?: RequestOptionsArgs): Observable<Response>;
}
interface IRequestBodyObservableDelegate {
    (url: string | Request, body?: string, options?: RequestOptionsArgs): Observable<Response>;
}

type IRequestObservableDelegate = IRequestSimpleObservableDelegate | IRequestBodyObservableDelegate;

现在我认为这两项任务都应该有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章