根据NestJS官方文档[1] ,它描述了“在 Nest 中,由于 TypeScript 的功能,管理依赖关系非常容易,因为它们只是按类型解析。”
我对这个描述很困惑,因为在运行时我们没有构造函数参数的任何类型信息,这些信息在编译过程中被删除了。
NestJS实际上是如何解决所需类型(类)与实际对象(实例)之间的匹配的?
最佳答案
感谢装饰器,我们实际上可以通过 Typescript 发出的元数据访问一些类型。 Nest 正是通过这种元数据来读取以了解如何将类实例注入(inject)到提供者中。这是从 nest new
app.service.ts
到 app.service.js
文件的编译 JS
"use strict";
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 });
exports.AppService = void 0;
const common_1 = require("@nestjs/common");
let AppService = class AppService {
getHello() {
return 'Hello World!';
}
};
AppService = __decorate([
(0, common_1.Injectable)()
], AppService);
exports.AppService = AppService;
//# sourceMappingURL=app.service.js.map
这是 app.controller.js
"use strict";
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 });
exports.AppController = void 0;
const common_1 = require("@nestjs/common");
const app_service_1 = require("./app.service");
let AppController = class AppController {
constructor(appService) {
this.appService = appService;
}
getHello() {
return this.appService.getHello();
}
};
__decorate([
(0, common_1.Get)(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", String)
], AppController.prototype, "getHello", null);
AppController = __decorate([
(0, common_1.Controller)(),
__metadata("design:paramtypes", [app_service_1.AppService])
], AppController);
exports.AppController = AppController;
//# sourceMappingURL=app.controller.js.map
如果我们查看 app.controller.js
的最后几行,我们可以看到一行 __metadata("design:paramtypes", [app_service_1.AppService])
.此行意味着 AppController
的构造函数具有应传递给它的 AppService
类型的参数。 Nest 能够读取它,检查模块容器的提供程序中是否有 AppService
,如果有,则将提供程序映射中的实例传递给 new AppController()
。此发出的类型数据可用于具有装饰器的类,并且发出的类型值始终是一个类,无论它是使用的自定义类还是原始类,如 Object
或 String
,但在后一种情况下,应该有一个自定义参数元数据通过 @Inject()
装饰器发出。
关于javascript - NestJS 是如何匹配注入(inject)目标和注入(inject)实例的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72766304/