前言
关键字
参数装饰器、依赖注入(依赖倒置)、运行时约束、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);
else
for (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);
else
for (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() {
// 验证处理(统一进行验证处理)
// 验证通过后保存到数据库
}
}
每个属性的验证规则统一进行处理。
验证规则,可以看做是业务中共同出现的功能块。