在這裏你去:
注:該類型的PathParams
,RequestHandler
和RequestHandlerParams
被髮明,但問題是,他們是不同的和不兼容的
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;
}
}
注意創造過載的定義時,實施簽名不可供消費者使用。只有沒有實現的簽名纔可用。這就是爲什麼我在示例中添加了額外的簽名。
之所以這樣的工作原理是,爲了使第一個參數「可選」我們需要給它一個類型可以與可能的其他參數類型的要麼數組元素類型兼容。
當然,你可以指定在執行簽名any
和any[]
的參數類型不影響類型安全爲您的客戶(實現簽名不是接口的一部分),但是,在使用了精密,結構良好的聯合類型,您可以使用類型警衛來區分參數並驗證實現是否處理它們。
這意味着您需要通過函數實現中的邏輯來確定第一個參數是否實際上是PathParams
。