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

标签 javascript typescript nestjs

根据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/

相关文章:

javascript - 使用内部有 php 变量的 php 创建 javascript 警报?

javascript - 如何将动态图像加载到网页中?

node.js - NestJS 访问管道中的响应对象

node.js - 如何实现对帐户激活链接的过期?

javascript - d3 瀑布图在 x 轴值上旋转 180 到 -90 度

javascript - JavaScript 如何检测正则表达式?

typescript - 如何将 Typescript AppSync 解析器捆绑到 CDK 中?

javascript - react : How to pass an array as props and render a list of images?

typescript - 作为 Prop 传递与提取缓存 Apollo 客户端 Nextjs

swagger - NestJs Swagger如何添加自定义图标