反思
轻量级ES模块 反射元数据 用于使用 TypeScript 的 实验装饰器支持,加上匹配的 API 标准装饰器 财务报告和审定财务报表 装饰元数据。 。 。 .
为什么?
建立这个图书馆的主要原因是提供更小的执行,可以作为一个模块列入.
- ES模块
reflection可装入<script type="module" src="..."></script>
- 大小( 未压缩)
reflect-metadata为~50Kcore-js/es7/reflect为~80K@abraham/reflection为~3K
阅读如何 从您的制作中减少 20K 角应用程序 切换到这个.
安装
npm install @abraham/reflection
什么进口?
使用匹配您的工程编译器 。 项目使用一种或另一种,而不是两种.
@abraham/reflection/legacy (默认) | @abraham/reflection/standard | |
|---|---|---|
| 装饰者 | 遗产 : experimentalDecorators: true | 标准: 类型脚本 5.2+ 无 experimentalDecorators,或 Babel 键 |
| 类型元数据 | design:type, (中文(简体) ), design:paramtypes, (中文(简体) ), design:returntype 与 emitDecoratorMetadata | 不详 |
| 参数装饰器 | 对 | 没有 |
| 全球 | 添加方法到 Reflect | 定义 Symbol.metadata 财务报告和审定财务报表 Function.prototype[Symbol.metadata] (单位:千美元)null如果缺少, 如 spec |
| 模块格式 | ES模块和UMD/CommonJS | ES模块 |
使用 @abraham/reflection/legacy 用于编码 reflect-metadata,包括依赖 emitDecoratorMetadata 用于依赖性注射。 赤裸裸的 @abraham/reflection 导入是同一个模块,因此现有的导入可以继续工作,两者可以混合.
使用 @abraham/reflection/standard 用于标准装饰器的新代码。 他们不会把课传给成员装饰师,所以 Reflect.defineMetadata 不能使用; 元数据通过装饰器 context.metadata 换句话说.
使用量
实验装饰器
tsconfig.json数字 :
{
"compilerOptions": {
"experimentalDecorators": true,
// Only needed for design:type, design:paramtypes, and design:returntype
"emitDecoratorMetadata": true,
// Needed for the ./legacy subpath; the bare import resolves with any setting
"moduleResolution": "bundler", // or "nodenext"
},
}
import '@abraham/reflection/legacy'; // or '@abraham/reflection'
Reflect.defineMetadata(metadataKey, metadataValue, target);
您也可以导入 Reflection数字 :
import { Reflection as Reflect } from '@abraham/reflection/legacy';
Reflect.defineMetadata(metadataKey, metadataValue, target);
标准装饰器
需要 TypeScript 5.2 或更晚. tsconfig.json数字 :
{
"compilerOptions": {
// Leave experimentalDecorators and emitDecoratorMetadata unset or false
// Any target except ESNext, which leaves @decorator syntax untransformed
"target": "ES2022",
// Needed to resolve the ./standard subpath export
"moduleResolution": "bundler", // or "nodenext"
// Only needed to type Symbol.metadata in your own code; add to your existing lib
"lib": ["ES2022", "ESNext.Decorators"],
},
}
在任何装饰类被定义之前导入, 所以 Symbol.metadata 当类创建时已存在.
import { metadata, getMetadata } from '@abraham/reflection/standard';
@metadata('role', 'admin')
class User {
@metadata('column', 'email')
email = '';
@metadata('route', '/users')
static list() {}
}
getMetadata('role', User); // 'admin'
getMetadata('column', User.prototype, 'email'); // 'email'
getMetadata('column', new User(), 'email'); // 'email'
getMetadata('route', User, 'list'); // '/users'
目标随之而来 reflect-metadata: 分类和静态成员元数据类, 以及原型或例如成员元数据. 子类继承了元数据,并且可以覆盖它. 价值是私藏的,所以阶级共享 Symbol.metadata 对象留给其他库.
API 密码
@abraham/reflection/legacy
现有方法如下:
Reflect.decorate(...);
Reflect.defineMetadata(...);
Reflect.deleteMetadata(...);
Reflect.getMetadata(...);
Reflect.getMetadataKeys(...);
Reflect.getOwnMetadata(...);
Reflect.getOwnMetadataKeys(...);
Reflect.hasMetadata(...);
Reflect.hasOwnMetadata(...);
Reflect.metadata(...);
@abraham/reflection/standard
metadata(metadataKey, metadataValue); // decorator for classes, methods, getters, setters, fields, and accessors
getMetadata(metadataKey, target, memberKey?);
getMetadataKeys(target, memberKey?);
getOwnMetadata(metadataKey, target, memberKey?);
getOwnMetadataKeys(target, memberKey?);
hasMetadata(metadataKey, target, memberKey?);
hasOwnMetadata(metadataKey, target, memberKey?);