前言
关键字
参数装饰器、依赖注入(依赖倒置)、运行时约束、emitDecoratorMetadata、reflect-metadata、AOP
notes
参数装饰器
应用场景:依赖注入(依赖倒置)
参数装饰器函数的参数:
参数1:如果方法是静态的,则为类本身;如果方法是实例方法,则为类的原型;
参数2:字符串类型,是方法名称
参数3:数字类型,表示该参数的索引,是第几个参数(索引从 0 开始)
关于 TS 自动注入的元数据
- 使用 reflect-metadata 库
- 在某个成员身上添加了元数据
- 启用了
emitDecoratorMetadata配置
只要满足上述条件,TS 的类型检查(约束)就可以在运行时进行。
TS 在编译结果中,会将约束的类型,作为元数据加入到相应位置。
AOP
AOP:aspect oriented programming,面向切面编程
AOP 是一种编程方式,属于面向对象开发。
将一些在业务中共同出现的功能块,横向切分,已达到分离关注点的目的。
不理解,后边有机会再深入了解
codes
class Test {sum(a: number, @test b: number) {return a + b;}static sayHello(@test name: string) {console.log(`hello my name is ${name}`);}}function test(target: any, methodName: string, index: number) {console.log(target,target === Test.prototype,target === Test,methodName,index);// => {} true falae sum 1// => [class Test] false true sayHello 0}
import "reflect-metadata";class User {@Reflect.metadata("a", "1")loginId: string;@Reflect.metadata("b", "2")age: number;}
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {var c = arguments.length,r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,d;if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);elsefor (var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;return c > 3 && r && Object.defineProperty(target, key, r), r;};Object.defineProperty(exports, "__esModule", {value: true});require("reflect-metadata");class User {}__decorate([Reflect.metadata("a", "1")], User.prototype, "loginId", void 0);__decorate([Reflect.metadata("b", "2")], User.prototype, "age", void 0);
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {var c = arguments.length,r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,d;if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);elsefor (var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;return c > 3 && r && Object.defineProperty(target, key, r), r;};var __metadata = (this && this.__metadata) || function (k, v) {if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);};Object.defineProperty(exports, "__esModule", {value: true});require("reflect-metadata");class User {}__decorate([Reflect.metadata("a", "1"),__metadata("design:type", String)], User.prototype, "loginId", void 0);__decorate([Reflect.metadata("b", "2"),__metadata("design:type", Number)], User.prototype, "age", void 0);
编译结果看不懂,不过功能大致是:能够在运行的时候,提供类型约束。
class User {loginId: string;loginPwd: string;age: number;pid: string;email: string;/*** 将用户保存到数据库*/save() {// 验证处理(统一进行验证处理)// 验证通过后保存到数据库}}
每个属性的验证规则统一进行处理。
验证规则,可以看做是业务中共同出现的功能块。
