2017-08-14 76 views
0

我创建了以下接口函数重载打字稿:如何定义重载函数类型

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); 

不知道如何当你提供的界面任何你试图给该接口必须匹配所有的呼叫签名的多个呼叫签名定义重载函数类型

+0

请告诉我制作这两个选项和身体可选的目的,但随后将它们定义两次?您可以使用第二个定义,该定义也适用于第一个示例调用。 – Wernerson

回答

2

。您对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; 

现在,我认为这两个任务应该工作。

+0

感谢您的重播,你知道任何构造,这将帮助我定义重载的函数类型(函数类型不是函数本身) – AbdulKareem

+0

我认为使用两个不同类型的联合将工作。查看更新的答案。 – Duncan

+0

再次感谢它的工作 – AbdulKareem

0

你缺少可选参数,你应该这样做是这样的:

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

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