Typescript 注释扫描是如何工作的?
How does Typescript Annotation Scan Works?
我正在做一个项目,在这个项目中我实现了注释来为 express 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);
}
}
在这个例子中,装饰器的执行顺序是,
- @属性()
- @method()
- @Class()
您可以使用下面的 link 检查一个工作示例,
回答下一个问题。
可以为此目的使用装饰器扫描仪。装饰器扫描器只是一个导出所有包含装饰器的文件的文件。
工作解决方案。
我正在做一个项目,在这个项目中我实现了注释来为 express 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);
}
}
在这个例子中,装饰器的执行顺序是,
- @属性()
- @method()
- @Class()
您可以使用下面的 link 检查一个工作示例,
回答下一个问题。
可以为此目的使用装饰器扫描仪。装饰器扫描器只是一个导出所有包含装饰器的文件的文件。
工作解决方案。