Adding properties to Koa2's context in Typescript

sdc395 picture sdc395 · Apr 1, 2017 · Viewed 7.4k times · Source

I want to use Facebook's DataLoader with Koa2 in Typescript. I want per-request DataLoader instances to go with my per-request database connections. How is this best achieved?

My current approach is to augment the Koa2 context but I'm failing because I don't know how to fix the type definition.

Here is my attempt at module augmentation...

import 'koa';

declare module 'koa' {
    namespace Application {
        interface BaseContext {
            dataLoader(): any;
        }
    }
}

Application.BaseContext.prototype.dataLoader = function() {
    console.log("Cannot find name 'Application' at line 11 col 1");
}

In addition to the error shown in the log call, I also get Property 'dataLoader' does not exist on type 'BaseContext' when I import the above and attempt to call dataLoader.

Cheers

Answer

skainswo picture skainswo · Jan 26, 2019

Just figured out an approach that doesn't require any type-hacking:

interface ICustomAppContext {
  mySlowToInitializeClient: string;
}

interface ICustomAppState {
  poop: string;
}

const app = new Koa<ICustomAppState, ICustomAppContext>();

See https://github.com/DefinitelyTyped/DefinitelyTyped/blob/b081a5b7d0db7181901d7834f8a85206af263094/types/koa/index.d.ts#L434 for details.