我很惊讶地发现下面的代码在 TypeScript 中编译得很好,并且仅在运行时出现错误:
class X {
set writeOnlyProp(value: number) {
// do some setting stuff
}
}
const x = new X()
// runtime error: Cannot read properties of undefined
console.log(x.writeOnlyProp.toString())
我知道在较新版本的 TS 中可以添加显式返回的 getter undefined
,但这似乎是一种 hack。有没有更好的方法来输入这个?或者也许是一个strict*
可以自动处理它的 TSConfig 标志?
Github 上有一些问题,例如microsoft/TypeScript#58112和microsoft/TypeScript#30852,它们解决了该行为。典型问题可能是microsoft/TypeScript#21759,它请求支持
writeonly
属性上的修饰符。无论如何,这首先被认为是一个重大变化(如该评论
set
中所述),但由于现在已被编码到声明文件中,因此将来可能会得到处理。截至目前,您可以使用访问器对ESLint 规则,该规则可配置为在
set
ter 缺少相应的get
ter 时出现错误。当您尝试访问 x.writeOnlyProp.toString() 时,会导致运行时错误,因为 x.writeOnlyProp 未定义(因为没有定义 getter)。
定义一个 Getter:定义一个返回未定义或其他默认值的 getter。这实际上不是一种 hack,而是一种确保属性在对象上定义的方法。