MST

星途 面试题库

面试题:TypeScript类装饰器在实际项目中如何实现依赖注入

请描述在TypeScript中使用类装饰器实现依赖注入的思路,并给出一个简单的示例代码,假设我们有一个服务类`UserService`,需要注入到`UserController`类中。
38.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 定义装饰器:创建一个装饰器函数,它接收要注入的服务类作为参数。
  2. 在装饰器内部:通过Reflect.metadata在目标类(需要注入服务的类)上存储服务类的元数据。
  3. 实例化和注入:在合适的地方(比如应用启动时),遍历所有标记了该装饰器的类,实例化需要注入的服务,并将其注入到目标类的实例中。

示例代码

// 定义UserService
class UserService {
    getUser() {
        return 'User data';
    }
}

// 定义依赖注入装饰器
function Inject(serviceClass: any) {
    return function (target: any) {
        Reflect.defineMetadata('inject:service', serviceClass, target);
    };
}

// UserController类,需要注入UserService
class UserController {
    private userService: UserService;

    constructor() {
        const serviceClass = Reflect.getMetadata('inject:service', this.constructor);
        if (serviceClass) {
            this.userService = new serviceClass();
        }
    }

    getUserData() {
        return this.userService.getUser();
    }
}

// 使用装饰器将UserService注入到UserController
@Inject(UserService)
class MyUserController extends UserController {}

// 使用
const controller = new MyUserController();
console.log(controller.getUserData());