segmentfault官方|为 Express 开外挂( 四 )


当然 Reflect 提供很多其他 API:
import 'reflect-metadata';
// 定义对象或属性的元数据
Reflect.defineMetadata(metadataKey, metadataValue, target);
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
// 检查对象或属性的原型链上是否存在元数据键
letresult = Reflect.hasMetadata(metadataKey, target);
letresult = Reflect.hasMetadata(metadataKey, target, propertyKey);
// 检查对象或属性是否存在自己的元数据键
letresult = Reflect.hasMetadata(metadataKey, target);
letresult = Reflect.hasMetadata(metadataKey, target, propertyKey);
// 获取对象或属性原型链上元数据键的元数据值
letresult = Reflect.getMetadata(metadataKey, target);
letresult = Reflect.getMetadata(metadataKey, target, propertyKey);
// 获取对象或属性的自己的元数据键的元数据值
letresult = Reflect.getOwnMetadata(metadataKey, target);
letresult = Reflect.getOwnMetadata(metadataKey, target, propertyKey);
// 获取对象或属性原型链上的所有元数据键
letresult = Reflect.getMetadataKeys(target);
letresult = Reflect.getMetadataKeys(target, propertyKey);
// 获取对象或属性的所有自己的元数据键
letresult = Reflect.getOwnMetadataKeys(target);
letresult = Reflect.getOwnMetadataKeys(target, propertyKey);
// 从对象或属性中删除元数据
letresult = Reflect.deleteMetadata(metadataKey, target);
letresult = Reflect.deleteMetadata(metadataKey, target, propertyKey);
// 通过装饰器将元数据应用于构造函数
@Reflect.metadata(metadataKey, metadataValue)
class C {
// 通过装饰器将元数据应用于方法(属性)
@Reflect.metadata(metadataKey, metadataValue)
method{
}
}
需要记得配置 tsconfig.json:
需要记得配置 tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"lib": [ "es6", "dom"],
"types": [ "reflect-metadata"],
"module": "commonjs",
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
在 Overnight 中主要使用有两个 API:

  • 使用 Reflect.defineMetadata API 添加元数据;
  • 使用 Reflect.getOwnMetadata API 读取元数据 。
下面以 Overnight 中类装饰器(Common Class)来介绍这两个 API 使用过程:
segmentfault官方|为 Express 开外挂
本文插图

2.4 小结
这里回顾下 Relect Metadata 的知识:
segmentfault官方|为 Express 开外挂
本文插图

理解清楚前面两个知识点后 , 我们接下来开始看看 Overnight 。
三、Overnight 详解
1. 概念介绍
OvernightJS 主要是为 Express 路由提供 Type 装饰器支持 , 通过装饰器来管理路由 。
是不是抽象了点?那看看下面这段代码吧:
@Controller( 'api/posts')
exportclass PostController {
@Get( ':id')
private get(req: Request, res: Response) {
// dosomething
}
}
如上面代码所示 , OvernightJS 就是这样使用 , 简单 , 明了 。


推荐阅读