在Typescript中为Koa2的上下文添加属性

时间:2017-04-01 18:36:43

标签: typescript koa2

我想在Typescript中使用Facebook的DataLoader和Koa2。我希望每个请求的DataLoader实例与我的每个请求数据库连接一起使用。如何最好地实现这一目标?

我目前的方法是增加Koa2上下文,但我失败了,因为我不知道如何修复类型定义。

以下是我对模块扩充的尝试......

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

除了日志调用中显示的错误外,我在导入上述内容时也会Property 'dataLoader' does not exist on type 'BaseContext',并尝试调用dataLoader

干杯

3 个答案:

答案 0 :(得分:5)

请查看Module Augmentation,了解其工作原理。

你确实可以这样做:

import { Context } from "koa";

declare module "koa" {
    /**
     * See https://www.typescriptlang.org/docs/handbook/declaration-merging.html for
     * more on declaration merging
     */
    interface Context {
        myProperty: string;
        myOtherProperty: number;
    }
}

答案 1 :(得分:4)

好吧,我想我还有很多需要学习的东西。打字问题的解决方案似乎是......

import { BaseContext } from 'koa';

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

并且,因为BaseContext是一个接口而不是一个类,所以在实例化Koa的dataLoader类之后,必须定义Application实现。

const app = new Application();

app.context.dataLoader = function() {
  console.log('OK, this works.');
}

app.context 用于创建每个请求的上下文对象的原型。

我很感激有关此答案正确性的任何意见。感谢。

啊......在公共场合学习。

答案 2 :(得分:2)

只是想出了一种不需要任何类型破解的方法:

interface ICustomAppContext {
  mySlowToInitializeClient: string;
}

interface ICustomAppState {
  poop: string;
}

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

有关详细信息,请参见https://github.com/DefinitelyTyped/DefinitelyTyped/blob/b081a5b7d0db7181901d7834f8a85206af263094/types/koa/index.d.ts#L434