簡體   English   中英

重載裝飾器導致“此重載簽名與其實現簽名不兼容”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM