使用 Typescript 类语法获取 Oak 中的当前上下文

时间:2021-07-24 17:47:24

标签: typescript deno oak

我在使用 Deno 和 Oak 的情况下遇到了以下情况。 大多数教程使用 export const xy = () => {} 语法,将控制器和路由分开。

在路线中,他们通常有类似 router.get("/the-route", xy) 的东西,这很好,但有几个我想避免的警告。

我不想要的

看看这个例子:

const someController = async ({
  request,
  response,
}: {
  request: any;
  response: any;
}) => {
  // do something
}

1.) 请求和响应是明确的“任何”,我尽量避免这种情况,因为没有类型安全和代码完成可用。 2.) 我想在类语法中使用可扩展的基控制器来执行此操作,其他类是从该基控制器派生的。

我搞砸了什么

所以目前我最终得到了这样的东西(这很毫无意义):

import type { RouterContext } from "https://deno.land/x/oak@v8.0.0/mod.ts";

export class BaseController {
  // deno-lint-ignore no-explicit-any
  protected ctx: RouterContext<{ id: string }, Record<string, any>>;

  // deno-lint-ignore no-explicit-any
  constructor(ctx: RouterContext<{ id: string }, Record<string, any>>) {
    this.ctx = this.getContext(ctx);
  }

  // deno-lint-ignore no-explicit-any
  getContext = (ctx: RouterContext<{ id: string }, Record<string, any>>) => {
    return ctx;
  };
}

正如你所看到的,除了接收一些传递给控制器​​的上下文之外,这几乎没有任何作用,这没有任何意义,因为

  1. 我需要在路线中执行类似 router.get("/", (ctx) => { SomeController.createSomething(ctx) }) 的操作。
  2. 我需要到处传递上下文(这显然不是目标)。如果我用 BaseController 扩展一个类,它自己有一个构造函数,我什至需要在此处使用 super(ctx : UltraLongType<ThatIDontWantHere>)
  3. 传递上下文

我真正想要达到的目标

长话短说:我真正想做的是让 BaseController.getContext 真正获取当前上下文,而不会将其传递到任何地方。

不幸的是,我找不到一些帮助程序或注入器或任何服务来从“外部”接收当前的 RouterContext。

我真的不明白这个。

也许有人可以帮我解决这个问题:)

提前致谢并致以最诚挚的问候:)

0 个答案:

没有答案