gpt4 book ai didi

typescript - 缓存构造函数导致 "Property ' .. .' has no initializer and is not definitely assigned in the constructor."

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:47 25 4
gpt4 key购买 nike

在我的项目中,我时不时地创建带有构造函数的类,这些构造函数缓存它们创建的对象,这样如果多次使用相同的参数调用构造函数,它每次都会返回相同的实例,而不是创建一个新的实例与已经创建的相同。

这是一个最小的例子:

class X {
private static __cache: Record<string, X> = Object.create(null);

readonly name: string; // The compilation error happens on this line.

constructor(name: string) {
const cached = X.__cache[name];
if (cached !== undefined) {
return cached;
}

this.name = name;
X.__cache[name] = this;
}
}

这段代码在 TypeScript 上工作得很好,直到我转到 2.7 并打开 strictPropertyInitialization 。现在我在 readonly name: string; 上得到一个错误说

Property 'name' has no initializer and is not definitely assigned in the constructor.

我的项目中有多个具有上述模式的类,因此我需要想出一个或多个通用解决方案来消除错误。

我不想要的两个解决方案:

  1. 关闭strictPropertyInitialization。我发现它通常太有用了,无法将其关闭。打开它会显示一些需要更新的定义,以更好地反射(reflect)我的一些类的工作方式,或者提示改进初始化代码。

  2. name添加一个明确的赋值断言,使其声明为readonly name!: string;。感叹号导致 TypeScript 不再检查 name 是否已明确分配。这消除了错误,但它也在编译器检查我的口味时打了一个太大的洞。例如,如果我使用断言并且不小心在上面的代码中删除了赋值 this.name = name,则 TypeScript 不会引发错误。我喜欢尽早收到错误通知。

我在上面给出了一个最小的例子,但在我的应用程序中,我有包含更多字段的类,或者是通过非常昂贵的计算创建的字段,而不仅仅是从构造函数参数中分配的字段。

最佳答案

对于对象字段的计算成本很高的情况,到目前为止我首选的解决方案是将 constructor 标记为 private(protected 可能在某些情况下指示)并将工厂函数声明为类的静态成员。像这样:

class X2 {
private static __cache: Record<string, X2> = Object.create(null);

readonly name: string;

private constructor(nameSource: string) {
this.name = expensiveComputation(nameSource);
}

// We use this factory function to create new objects instead of
// using `new X2` directly.
static make(name: string): X2 {
const cached = X2.__cache[name];
if (cached !== undefined) {
return cached;
}

return X2.__cache[name] = new X2(name);
}
}

因为构造函数总是设置它的所有字段,所以 TypeScript 不再有问题。这就要求使用类的代码使用工厂函数来创建新对象,而不是直接使用构造函数。

关于typescript - 缓存构造函数导致 "Property ' .. .' has no initializer and is not definitely assigned in the constructor.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48601943/

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