前言

关键字
参数装饰器、依赖注入(依赖倒置)、运行时约束、emitDecoratorMetadata、reflect-metadata、AOP

notes

参数装饰器

应用场景:依赖注入(依赖倒置)

参数装饰器函数的参数:
参数1:如果方法是静态的,则为类本身;如果方法是实例方法,则为类的原型;
参数2:字符串类型,是方法名称
参数3:数字类型,表示该参数的索引,是第几个参数(索引从 0 开始)

关于 TS 自动注入的元数据

  1. 使用 reflect-metadata 库
  2. 在某个成员身上添加了元数据
  3. 启用了 emitDecoratorMetadata 配置

只要满足上述条件,TS 的类型检查(约束)就可以在运行时进行。
TS 在编译结果中,会将约束的类型,作为元数据加入到相应位置。

AOP

AOP:aspect oriented programming,面向切面编程

AOP 是一种编程方式,属于面向对象开发。

将一些在业务中共同出现的功能块,横向切分,已达到分离关注点的目的。

不理解,后边有机会再深入了解

codes

  1. class Test {
  2. sum(a: number, @test b: number) {
  3. return a + b;
  4. }
  5. static sayHello(@test name: string) {
  6. console.log(`hello my name is ${name}`);
  7. }
  8. }
  9. function test(target: any, methodName: string, index: number) {
  10. console.log(
  11. target,
  12. target === Test.prototype,
  13. target === Test,
  14. methodName,
  15. index
  16. );
  17. // => {} true falae sum 1
  18. // => [class Test] false true sayHello 0
  19. }
  1. import "reflect-metadata";
  2. class User {
  3. @Reflect.metadata("a", "1")
  4. loginId: string;
  5. @Reflect.metadata("b", "2")
  6. age: number;
  7. }
  1. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  2. var c = arguments.length,
  3. r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
  4. d;
  5. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6. else
  7. for (var i = decorators.length - 1; i >= 0; i--)
  8. if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  9. return c > 3 && r && Object.defineProperty(target, key, r), r;
  10. };
  11. Object.defineProperty(exports, "__esModule", {
  12. value: true
  13. });
  14. require("reflect-metadata");
  15. class User {}
  16. __decorate([
  17. Reflect.metadata("a", "1")
  18. ], User.prototype, "loginId", void 0);
  19. __decorate([
  20. Reflect.metadata("b", "2")
  21. ], User.prototype, "age", void 0);
  1. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  2. var c = arguments.length,
  3. r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
  4. d;
  5. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6. else
  7. for (var i = decorators.length - 1; i >= 0; i--)
  8. if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  9. return c > 3 && r && Object.defineProperty(target, key, r), r;
  10. };
  11. var __metadata = (this && this.__metadata) || function (k, v) {
  12. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13. };
  14. Object.defineProperty(exports, "__esModule", {
  15. value: true
  16. });
  17. require("reflect-metadata");
  18. class User {}
  19. __decorate([
  20. Reflect.metadata("a", "1"),
  21. __metadata("design:type", String)
  22. ], User.prototype, "loginId", void 0);
  23. __decorate([
  24. Reflect.metadata("b", "2"),
  25. __metadata("design:type", Number)
  26. ], User.prototype, "age", void 0);

编译结果看不懂,不过功能大致是:能够在运行的时候,提供类型约束。

  1. class User {
  2. loginId: string;
  3. loginPwd: string;
  4. age: number;
  5. pid: string;
  6. email: string;
  7. /**
  8. * 将用户保存到数据库
  9. */
  10. save() {
  11. // 验证处理(统一进行验证处理)
  12. // 验证通过后保存到数据库
  13. }
  14. }

每个属性的验证规则统一进行处理。
验证规则,可以看做是业务中共同出现的功能块。