1. 缓存装饰器结果
- 思路:对于相同输入和权限配置,缓存装饰器的处理结果,避免重复计算。
- 示例:
const permissionCache = new Map();
function permissionDecorator(role: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const cacheKey = `${propertyKey}:${role}`;
if (permissionCache.has(cacheKey)) {
return permissionCache.get(cacheKey);
}
// 实际权限检查逻辑
const hasPermission = checkPermission(role, target, propertyKey);
if (hasPermission) {
const result = originalMethod.apply(this, args);
permissionCache.set(cacheKey, result);
return result;
} else {
throw new Error('没有权限');
}
};
return descriptor;
};
}
function checkPermission(role: string, target: any, propertyKey: string): boolean {
// 这里写具体权限检查逻辑,比如从配置文件读取权限等
return true;
}
2. 减少装饰器嵌套
- 思路:过多的装饰器嵌套会增加执行栈深度和执行时间,尽量合并或简化装饰器逻辑。
- 示例:
// 合并前
function decorator1() {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
// 逻辑1
return descriptor;
};
}
function decorator2() {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
// 逻辑2
return descriptor;
};
}
class MyClass {
@decorator1()
@decorator2()
myMethod() {}
}
// 合并后
function combinedDecorator() {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
// 合并逻辑1和逻辑2
return descriptor;
};
}
class MyClass {
@combinedDecorator()
myMethod() {}
}
3. 静态分析权限
- 思路:在构建阶段或启动阶段,通过静态分析确定哪些方法需要权限控制,提前计算好权限结果,而不是每次调用时检查。
- 示例:
// 构建阶段或启动阶段执行
const staticPermissions = new Map();
function analyzePermissions() {
// 假设这里通过静态分析获取所有带权限装饰器的方法及对应权限
const allDecoratedMethods = getDecoratedMethods();
allDecoratedMethods.forEach(({ method, role }) => {
const hasPermission = checkPermission(role, null, method.name);
staticPermissions.set(method, hasPermission);
});
}
function permissionDecorator(role: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const hasPermission = staticPermissions.get(originalMethod);
if (hasPermission) {
return originalMethod.apply(this, args);
} else {
throw new Error('没有权限');
}
};
return descriptor;
};
}