12

我想在 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.

干杯

4

3 回答 3

15

刚刚想出了一种不需要任何类型黑客攻击的方法:

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

于 2019-01-25T23:49:14.043 回答
9

查看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;
    }
}
于 2017-10-23T23:03:22.067 回答
6

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

import { BaseContext } from 'koa';

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

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

const app = new Application();

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

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

对于此答案的正确性,我将不胜感激。谢谢。

啊……公开学习。

于 2017-04-24T09:25:10.893 回答