typescript - 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();
这是一个示例代码。注释的是分开的文件。所有导入都已完成。
解决方案
我遇到的问题包含两个问题,它们是,
- Typescript 注释扫描是如何工作的?
- 我的代码有什么问题?
要回答第一个问题,装饰器扫描总是从内部开始。按照从上到下的顺序。
@Class()
export class Sample {
@property()
testVar: string = "hi";
@method()
helloWorld() {
console.log(this.testVar);
}
}
在这个例子中,装饰器的执行顺序如下:
- @财产()
- @方法()
- @班级()
您可以使用下面的链接检查一个工作示例,
回答下一个问题。
可以为此目的使用装饰器扫描仪。装饰器扫描器只是一个导出所有包含装饰器的文件的文件。
工作解决方案。
推荐阅读
- java - 来自不同模块的类导致 java.lang.IllegalArgumentException: Not a managed type
- sql - 如何选择 a.* FROM a WHERE 除外 SELECT b.* FROM b WHERE a.id != b.id
- ios - Swift 测试:控制 moc api 客户端行为
- python - 如果要显示评论,我如何限制数字
- php - 使用 bindParam 查询不能按预期工作,但它可以使用原始输入?
- docker - 无法从 Docker 本地不安全注册表中提取图像:http:服务器向 HTTPS 客户端提供了 HTTP 响应
- reactjs - Caldera Form Advanced File Upload 2 不在 Internet Explorer 中呈现
- python - 在 python 中将 h264 代码转换为图像
- reactjs - 如何在反应中将选择框的值重置为默认值
- python - 按下空格键开始游戏(海龟模块)