在 Typescript 中向 Koa2 的上下文添加属性
Adding properties to Koa2's context in Typescript
我想在 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");
}
除了日志调用中显示的错误之外,当我导入上述内容并尝试调用 dataLoader
.
时,我还会得到 Property 'dataLoader' does not exist on type 'BaseContext'
干杯
好的,我想我还有很多东西要学。输入问题的解决方案似乎是...
import { BaseContext } from 'koa';
declare module 'koa' {
interface BaseContext {
dataLoader(): any;
}
}
而且,因为 BaseContext
是一个接口而不是 class,你必须在实例化 Koa 的 Application
[=28= 之后定义 dataLoader
实现].
const app = new Application();
app.context.dataLoader = function() {
console.log('OK, this works.');
}
app.context
是用于创建每个请求的上下文对象的原型。
对于有关此答案正确性的任何评论,我将不胜感激。谢谢。
啊...学习public.
查看 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;
}
}
刚刚想出了一个不需要任何类型修改的方法:
interface ICustomAppContext {
mySlowToInitializeClient: string;
}
interface ICustomAppState {
poop: string;
}
const app = new Koa<ICustomAppState, ICustomAppContext>();
我想在 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");
}
除了日志调用中显示的错误之外,当我导入上述内容并尝试调用 dataLoader
.
Property 'dataLoader' does not exist on type 'BaseContext'
干杯
好的,我想我还有很多东西要学。输入问题的解决方案似乎是...
import { BaseContext } from 'koa';
declare module 'koa' {
interface BaseContext {
dataLoader(): any;
}
}
而且,因为 BaseContext
是一个接口而不是 class,你必须在实例化 Koa 的 Application
[=28= 之后定义 dataLoader
实现].
const app = new Application();
app.context.dataLoader = function() {
console.log('OK, this works.');
}
app.context
是用于创建每个请求的上下文对象的原型。
对于有关此答案正确性的任何评论,我将不胜感激。谢谢。
啊...学习public.
查看 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;
}
}
刚刚想出了一个不需要任何类型修改的方法:
interface ICustomAppContext {
mySlowToInitializeClient: string;
}
interface ICustomAppState {
poop: string;
}
const app = new Koa<ICustomAppState, ICustomAppContext>();