2017-04-21 107 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在這個例子中斷言正確的類型)。

相關問題