2017-04-21 20 views
0

外部ライブラリタイプの宣言があります。restパラメータを使用してオーバーロードメソッドを作成するにはどうすればよいですか?

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

この宣言に基づいて、use()メソッドを使用してクラスを作成する必要があります。 これは、オーバーロードメソッドを作成する必要があることを明確に示しています。 は、私は次のようにこれを実行しようとしました。このようなエラーを受信したものに

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

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

はどのように正しく使用()メソッドを作成するのですか?あなたは残りのパラメーターを使用すると

答えて

0

は、typescriptですコンパイラは関数の先頭に以下のJSコードを生成します。このコードは、暗黙のargumentsオブジェクトから読んでいる

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

、そして自分自身でするかどうかを検出することはできません最初の引数はPathParamsまたはRequestHandlerまたはRequestHandlerParamsです。

しかし、我々はこれらの過負荷の実際の実装を持っていることによって、この自分自身を行うことができますはパラメータを取らず、手動でargumentsを読ん:

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

(私が主張するために、この例ではヘルパー型ガードfunction isPathParams(obj: any): obj is PathParamsを使用しています正しいタイプ。)

関連する問題