2017-04-21 3 views
0

Une déclaration des types de bibliothèques externes est donnée. Je cite des parties utilisées de lui:Comment créer une méthode de surcharge avec un paramètre de repos?

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>; 
    // ... 
} 

Basé sur cette déclaration, j'ai besoin de créer une classe avec la méthode use(). Il montre clairement que vous devez créer une méthode de surcharge. J'ai essayé de le faire comme suit:

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; 
    } 
    // ... 
} 

ce qui a reçu une telle erreur:

error TS2394: Overload signature is not compatible with function implementation. 

Comment puis-je créer correctement une méthode d'utilisation()?

Répondre

0

Lorsque vous utilisez un paramètre de repos, le compilateur dactylographiée génère le code JS suivant au début de votre fonction:

var handlers = []; 
for (var _i = 0; _i < arguments.length; _i++) { 
    handlers[_i] = arguments[_i]; 
} 

Ce code est en train de lire l'objet arguments implicite, et ne peut pas lui-même détecter si le premier argument est un PathParams ou un RequestHandler ou RequestHandlerParams.

Cependant, nous pouvons faire nous-mêmes en ayant la mise en œuvre effective de ces surcharges ne prennent pas de paramètres et de la lecture arguments manuellement:

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; 
} 

(je suis en utilisant un agent de type aide function isPathParams(obj: any): obj is PathParams dans cet exemple pour faire valoir la type correct.)