gpt4 book ai didi

javascript - NestJS 是如何匹配注入(inject)目标和注入(inject)实例的?

转载 作者:行者123 更新时间:2023-12-05 04:27:50 28 4
gpt4 key购买 nike

根据NestJS官方文档[1] ,它描述了“在 Nest 中,由于 TypeScript 的功能,管理依赖关系非常容易,因为它们只是按类型解析。”

我对这个描述很困惑,因为在运行时我们没有构造函数参数的任何类型信息,这些信息在编译过程中被删除了。

NestJS实际上是如何解决所需类型(类)与实际对象(实例)之间的匹配的?

最佳答案

感谢装饰器,我们实际上可以通过 Typescript 发出的元数据访问一些类型。 Nest 正是通过这种元数据来读取以了解如何将类实例注入(inject)到提供者中。这是从 nest new

app.service.tsapp.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()。此发出的类型数据可用于具有装饰器的类,并且发出的类型值始终是一个类,无论它是使用的自定义类还是原始类,如 ObjectString,但在后一种情况下,应该有一个自定义参数元数据通过 @Inject() 装饰器发出。

关于javascript - NestJS 是如何匹配注入(inject)目标和注入(inject)实例的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72766304/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com