MST

星途 面试题库

面试题:TypeScript装饰器在类方法权限验证中的应用

假设有一个包含多个方法的类,每个方法需要不同的权限才能访问(例如:'read'权限用于读取方法,'write'权限用于写入方法)。请使用TypeScript装饰器为这个类的方法添加权限验证逻辑。并阐述如何动态设置用户权限,并在调用类方法时进行实时的权限检查。
31.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 使用TypeScript装饰器添加权限验证逻辑
    type Permission ='read' | 'write';
    const userPermissions: Permission[] = [];
    
    function checkPermission(permission: Permission) {
        return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
            const originalMethod = descriptor.value;
            descriptor.value = function (...args: any[]) {
                if (userPermissions.includes(permission)) {
                    return originalMethod.apply(this, args);
                } else {
                    throw new Error('没有足够的权限');
                }
            };
            return descriptor;
        };
    }
    
    class MyClass {
        @checkPermission('read')
        readMethod() {
            console.log('执行读取操作');
        }
    
        @checkPermission('write')
        writeMethod() {
            console.log('执行写入操作');
        }
    }
    
  2. 动态设置用户权限并实时检查
    • 动态设置用户权限:可以通过一个函数来修改userPermissions数组。例如:
    function setUserPermissions(permissions: Permission[]) {
        userPermissions.length = 0;
        userPermissions.push(...permissions);
    }
    
    • 实时检查:在调用类方法时,装饰器中的逻辑会实时检查userPermissions数组中是否包含所需的权限。如果包含,则执行方法;否则,抛出错误。
    const myInstance = new MyClass();
    setUserPermissions(['read']);
    try {
        myInstance.readMethod();
        myInstance.writeMethod();// 这里会抛出没有足够权限的错误
    } catch (error) {
        console.error(error.message);
    }
    

在上述代码中,checkPermission装饰器接收一个权限参数,并在装饰的方法被调用时检查用户是否具有该权限。setUserPermissions函数用于动态设置用户权限,而类方法调用时会实时依据当前设置的用户权限进行权限检查。