[英]Overloading decorator cause 'This overload signature is not compatible with its implementation signature'
我正在為我的 API 方法開發裝飾器,我遇到了這個問題。 我正在嘗試重載裝飾器並處理“此重載簽名與其實現簽名不兼容”錯誤。
這是我創建的代碼片段:
export function ApiMethod<TResponse extends ApiResponse>(options: { methodName: string }):
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<() => Promise<TResponse>>) => void
export function ApiMethod<TResponse extends ApiResponse>(options: { methodName: string, accessPolicy: MethodAccessPolicy }):
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(payload: JwtPayload) => Promise<TResponse>>) => void
export function ApiMethod<TParams extends Object, TResponse extends ApiResponse>(options: { methodName: string, paramsType: (new (...args: Array<any>) => TParams) }):
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params: TParams) => Promise<TResponse>>) => void
// Here is the error
export function ApiMethod<TParams extends Object, TResponse extends ApiResponse>(options: { methodName: string, paramsType: (new (...args: Array<any>) => TParams), accessPolicy: MethodAccessPolicy }):
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params: TParams, payload: JwtPayload) => Promise<TResponse>>) => void
export function ApiMethod<TParams extends Object, TResponse extends ApiResponse>(options: MethodOptions | ParameterizedMethodOptions<TParams>):
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => void
{
return (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => {
};
}
interface MethodOptions {
methodName: string;
accessPolicy?: MethodAccessPolicy;
}
interface ParameterizedMethodOptions<TParams> extends MethodOptions {
paramsType?: (new (...args: Array<any>) => TParams);
}
我設置了這樣的一般限制,因此裝飾方法可以有參數或負載或兩者兼有,具體取決於您使用的重載:
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => void
所有的重載都在工作——我不能設置任何參數,只能設置有效載荷,只能設置參數,但由於錯誤我無法設置有效載荷和參數。
任何幫助,將不勝感激。 提前致謝。
您沒有提供JwtPayload
的類型,我假設它是Record<string, any>
這讓我可以重現錯誤。
這是因為失敗重載的返回類型與實現簽名不同。
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params: TParams, payload: JwtPayload) => Promise<TResponse>>) => void
相對
(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => void
您必須合並返回類型:
export function ApiMethod<TParams extends Object, TResponse extends ApiResponse>(options: MethodOptions | ParameterizedMethodOptions<TParams>):
((target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params: TParams, payload: JwtPayload) => Promise<TResponse>>) => void) |
((target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => void)
{
return (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<(params?: TParams, payload?: JwtPayload) => Promise<TResponse>>) => {
};
}
至於為什么會出現這種情況,我認為是因為TParams
是泛型而JwtPayload
不是,因此 TS 不能保證JwtPayload
在重載中使用相同類型或預期類型實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.