Добавить объявление метода в базовый класс - PullRequest
0 голосов
/ 31 марта 2019

Я хочу добавить объявление к методу koa-router get, которое позволит мне добиться привязки модели маршрута с помощью TypeORM.

Что-то вроде следующего:

router.get("/photos/:photo", (photo: Photo) => {
  return { photo }
});

Если бы я должен был вызвать /photos/1, он бы возвратил объект Photo в виде JSON.

Типы коа-роутера находятся по адресуhttps://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa-router/index.d.ts#L184

Итак, я попытался расширить класс, объявить аргументы метода базового класса, а также добавить дополнительное объявление.

import * as Router from 'koa-router'

export class LoopedRouter<StateT, CustomT> extends Router {

  get(path: string | RegExp | (string | RegExp)[], ...middleware: Array<Router.IMiddleware<StateT, CustomT>>): Router<StateT, CustomT>;

  get(path: string, callback: Function): Router {

    // code here to support base class and extended API

    let args = resolveModels(path, callback)

    return super.get(path, ctx => callback(...args))
  }
}

Однако я получаю следующую ошибку от tsc:

error TS2416: Property 'get' in type 'LoopedRouter<StateT, CustomT>' is not assignable to the same property in base type 'Router<any, {}>'.
      Type '(path: string | RegExp | (string | RegExp)[], ...middleware: Middleware<ParameterizedContext<StateT, CustomT & IRouterParamContext<StateT, CustomT>>>[]) => Router<StateT, CustomT>' is not assignable to type '{ (name: string, path: string | RegExp, ...middleware: Middleware<ParameterizedContext<any, IRouterParamContext<any, {}>>>[]): Router<any, {}>; (path: string | RegExp | (string | RegExp)[], ...middleware: Middleware<...>[]): Router<...>; <T, U>(name: string, path: string | RegExp, middleware: Middleware<...>, routeH...'.
        Types of parameters 'middleware' and 'path' are incompatible.
          Type 'string | RegExp' is not assignable to type 'Middleware<ParameterizedContext<StateT, CustomT & IRouterParamContext<StateT, CustomT>>>'.
            Type 'string' is not assignable to type 'Middleware<ParameterizedContext<StateT, CustomT & IRouterParamContext<StateT, CustomT>>>'.

    5   get(path: string | RegExp | (string | RegExp)[], ...middleware: Array<Router.IMiddleware<StateT, CustomT>>): Router<StateT, CustomT>;
...