2017-04-21 28 views
0

這裏就是Typecript編譯詛咒代碼:打字稿錯誤TS2394:超載簽名不是與功能實現兼容

use(path: PathParams, ...handlers: RequestHandler[]): this 
use(path: PathParams, ...handlers: RequestHandlerParams[]): this 
use(...handlers: RequestHandler[]): this 
use(...handlers: RequestHandlerParams[]): this { 
    // ... 
    return this; 
} 

錯誤TS2394:超載簽名不是與功能實現兼容。

我無法理解我該如何正確地完成過載。你能告訴哪個方向挖?

回答

1

在這裏你去:

注:該類型的PathParamsRequestHandlerRequestHandlerParams被髮明,但問題是,他們是不同的和不兼容的

export interface PathParams { 
    path: string; 
    params: { 
    id: number, 
    [key: string]: string | number 
    } 
} 

export type RequestHandler = (request: RequestHandlerParams) => void; 

export interface RequestHandlerParams { 
    kind: 'query' | 'route' 
    value: string; 
} 

export default class { 
    use(path: PathParams, ...handlers: RequestHandler[]): this 
    use(path: PathParams, ...handlers: RequestHandlerParams[]): this 
    use(...handlers: RequestHandler[]): this 
    use(...handlers: RequestHandlerParams[]): this; 
    use(
    pathOrHandlerOrHandlerParam: PathParams | RequestHandler | RequestHandlerParams, 
    ...handlers: Array<RequestHandler | RequestHandlerParams> 
): this { 
    // ... 
    return this; 
    } 
} 

注意創造過載的定義時,實施簽名不可供消費者使用。只有沒有實現的簽名纔可用。這就是爲什麼我在示例中添加了額外的簽名。

之所以這樣的工作原理是,爲了使第一個參數「可選」我們需要給它一個類型可以與可能的其他參數類型的要麼數組元素類型兼容。

當然,你可以指定在執行簽名anyany[]的參數類型不影響類型安全爲您的客戶(實現簽名不是接口的一部分),但是,在使用了精密,結構良好的聯合類型,您可以使用類型警衛來區分參數並驗證實現是否處理它們。

這意味着您需要通過函數實現中的邏輯來確定第一個參數是否實際上是PathParams