Typescript:如何定义重载的函数类型

时间:2017-08-14 13:37:00

标签: typescript

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

您可能会做的是定义两个单独的接口,每个接口一个接口,然后是IRequestObservableDelegate类型,这两个接口的并集。然后f1f2各自被定义为保存相关的受限制接口,但仍然可以传递给接受联合接口的函数。这当然意味着使用union接口的代码必须对回调函数的类型进行断言,这样在调用它时就不会失去类型安全性。

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

type IRequestObservableDelegate = IRequestSimpleObservableDelegate | IRequestBodyObservableDelegate;

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

答案 1 :(得分:1)

您缺少可选参数,您应该这样做:

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

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