Nest.js 如何实现的依赖注入
💸

Nest.js 如何实现的依赖注入

Tags
typescript
node
Update
Aug 26, 2021 06:05 PM
Create
Aug 7, 2021 09:27 AM
刚刚学习 Nest.js 的时候,一直有一个疑问: module 中的 import,provider 需不需要指定顺序啊,构造函数怎么按顺序拿到正确的参数。。。
之后发现,只要正确的在 module 中引用了,就不需要关系引用顺序, 框架会自动帮我们做这件事。
 
这就比较奇怪了:我们用 typescript 写的代码里的 constructor 虽然指明了参数的类型,但是编译成 js 之后就没有类型了,构造函数怎么知道每一个参数的类型呢?
 
使用 ts 输入这段代码:
class A {

}
@asd
class B {
  constructor(private a: A) {
    console.log(123)
  }
}
将其编译成 js:
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);
};
class A {
}
let B = class B {
    constructor(a) {
        this.a = a;
        console.log(123);
    }
};

// 这里是关键
B = __decorate([
    asd,
    __metadata("design:paramtypes", [A])
], B);
之后我们就可以用 Reflect 拿到对应的构造器参数类型了