javascript - Typescript 类构造函数生成的代码顺序
问题描述
我正在编写一个服务,运行它时出现以下错误。有问题的部分是:
import { Configuration } from "./Configuration";
import { BooksApplication } from "./application/BookApplication";
import { PersistenceBookRepository } from "./application/PersistenceBookRepository";
import { DatabaseAccessor } from "./database/DatabaseAccessor";
export class Context {
public readonly configuration: Configuration;
public constructor(configuration: Configuration) {
this.configuration = configuration;
}
private readonly databaseAccessor = new DatabaseAccessor(
this.configuration.databaseConfiguration
);
private readonly bookRepository = new PersistenceBookRepository(
this.databaseAccessor
);
private readonly bookService = new BooksApplication(this.bookRepository);
}
和错误:
TypeError: Cannot read property 'databaseConfiguration' of undefined
at new Context (/sandbox/src/Context.ts:14:24)
at Object.<anonymous> (/sandbox/src/index.ts:6:17)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
error Command failed with exit code 1.
我检查了 Typescript 生成的代码,它看起来像这样:
// ...
var Context = (function () {
function Context(configuration) {
this.databaseAccessor = new DatabaseAccessor_1.DatabaseAccessor(this.configuration.databaseConfiguration);
this.bookRepository = new PersistenceBookRepository_1.PersistenceBookRepository(this.databaseAccessor);
this.bookService = new BooksApplication_1.BooksApplication(this.bookRepository);
this.configuration = configuration;
}
return Context;
}());
// ...
如您所见this.configuration = configuration;
,最后this.databaseAccessor = new DatabaseAccessor_1.DatabaseAccessor(this.configuration.databaseConfiguration);
失败了。
我做错了什么还是打字稿中有错误?
我试图改变班级成员的顺序,但结果相同。
我有一个项目在这里重现该问题:https ://codesandbox.io/embed/644k5kwr4r
谢谢。
解决方案
根据规范提案¹,这实际上是正确的启动顺序:
当评估字段初始值设定项并将字段添加到实例时:
基类:在构造函数执行的开始,甚至在参数解构之前。
派生类:就在 super() 返回之后。(如何调用 super() 的灵活性导致许多实现为这种情况创建了一个单独的不可见的 initialize() 方法。)
TLDR:类字段首先执行,在构造函数主体之前。
不过,您可以将初始化移到构造函数中。
¹ 由于 TS 是 JS 的超集,它也必须符合 ES 规范。
推荐阅读
- python - 检测到的项目的 OpenCV 重复位置
- django - 无法安装 mod_wsgi 包
- javascript - 未捕获的类型错误:无法读取未定义的属性(读取“onClicked”)
- docker - 如何防止 docker build 重新下载复制的 Go 供应商
- python - 返回一种设置类属性的方法
- javascript - react-hook-form:handleSubmit 不是函数
- c# - 在 C# 中使用 Selenium 添加功能的正确方法是什么?
- reactjs - 如何在 Reactjs 中使用上下文提供者和消费者?
- css - 我怎样才能将“调整大小手柄”绝对定位在另一个具有位置粘性的元素之上?
- azure - Xamarin 表单中的 Azure AD B2C