2017-04-21 45 views
0

给出了外部库类型的声明。我引用它的旧零件:如何用一个rest参数创建一个重载方法?

interface IRouterMatcher<T> { 
    (path: PathParams, ...handlers: RequestHandler[]): T; 
    (path: PathParams, ...handlers: RequestHandlerParams[]): T; 
} 

interface IRouterHandler<T> { 
    (...handlers: RequestHandler[]): T; 
    (...handlers: RequestHandlerParams[]): T; 
} 


interface IRouter extends RequestHandler { 
    // ... 
    use: IRouterHandler<this> & IRouterMatcher<this>; 
    // ... 
} 

基于这个声明,我需要用use()方法创建一个类。它清楚地表明您需要创建一个重载方法。 我试图做到这一点,如下所示:

export default class Router extends RequestHandler { 
    // ... 
    use(path: PathParams, ...handlers: RequestHandler[]): this 
    use(path: PathParams, ...handlers: RequestHandlerParams[]): this 
    use(...handlers: RequestHandler[]): this 
    use(...handlers: RequestHandlerParams[]): this { 
     // ... 
     return this; 
    } 
    // ... 
} 

在什么已经收到这样的错误:

error TS2394: Overload signature is not compatible with function implementation. 

如何正确地创建一个使用()方法?

回答

0

当你使用其他参数,打字稿编译器生成的函数的开头下面的JS代码:

var handlers = []; 
for (var _i = 0; _i < arguments.length; _i++) { 
    handlers[_i] = arguments[_i]; 
} 

此代码是从隐含arguments对象阅读,而不能自行检测是否第一个参数是PathParamsRequestHandlerRequestHandlerParams

但是,我们可以通过其实际执行这些重载的做到这一点我们不带任何参数和手动阅读arguments

use(): this { 
    let path: PathParams; 
    let indexOffset = 0; 
    if (isPathParams(arguments[0])) { 
     path = arguments[0]; 
     indexOffset = 1; 
    } 
    let handlers: RequestHandler[] | RequestHandlerParams[] = []; 
    for (var i = indexOffset; i < arguments.length; i++) { 
     handlers[i - indexOffset] = arguments[i]; 
    } 
    // ... 
    return this; 
} 

(我使用一个辅助型后卫function isPathParams(obj: any): obj is PathParams在这个例子中断言正确的类型)。

相关问题