首页 > 解决方案 > Typescript 注释扫描是如何工作的?

问题描述

我正在做一个项目,我已经实现了注释来为快速 api 应用程序进行路由。但是我在运行时得到一个空的路由列表。

我已经尝试了很多资源,但无法弄清楚如何去做。

// RouteService File
export const routes: {
    path: string,
    router: string[]
}[] = [];

export function GetDynamicRoutes(): string[] {
  let router: string[] = [];
  routes.forEach(route => {
    router = router.concat(route.router);
  })
  return router;
}

// Decorators File
import { routes } from "../service/route.service";
import { AbstractController } from "../controller/abstract.controller";

export function Route(path: string) {
    return function (constructor: Function) {
        routes.push({
            path,
            router: constructor.prototype.router
        });
    }
}

export function RouteRequest(path?: string) {
    return function (target: Object, key: string | symbol,
        descriptor: PropertyDescriptor) {
        if (target.isPrototypeOf(AbstractController)) {
            const router = (target as AbstractController).router;
            const endpoint = path ? path : key.toString();

            router.push(endpoint);
        }
    }
}

// AbstractController file
export class AbstractController {
  public router: string[];

  constructor() {
    this.router = [];
  }
}

// TestController File
import { Route, RouteRequest } from "../decorator/route.decorator";
import { AbstractController } from "./abstract.controller";

@Route('test')
export class TestController extends AbstractController {
    @RouteRequest()
    helloWorld() {
        console.log('inside-hello-world');
    }
}

// Main File
import { GetDynamicRoutes } from "./service/route.service";

function main() {
    const routes = GetDynamicRoutes();
    console.log(routes);
}
main();

这是一个示例代码。注释的是分开的文件。所有导入都已完成。

编辑 young-goldwasser-t8byo

标签: typescriptexpressannotations

解决方案


我遇到的问题包含两个问题,它们是,

  1. Typescript 注释扫描是如何工作的?
  2. 我的代码有什么问题?

要回答第一个问题,装饰器扫描总是从内部开始。按照从上到下的顺序。

@Class()
export class Sample {
  @property()
  testVar: string = "hi";

  @method()
  helloWorld() {
    console.log(this.testVar);
  }
}

在这个例子中,装饰器的执行顺序如下:

  1. @财产()
  2. @方法()
  3. @班级()

您可以使用下面的链接检查一个工作示例,

编辑 xenodochial-forest-i2zz6

回答下一个问题。

可以为此目的使用装饰器扫描仪。装饰器扫描器只是一个导出所有包含装饰器的文件的文件。

工作解决方案。

编辑 lively-meadow-houoj


推荐阅读