我有这样的东西:
class Computed<Value> {
_value: Value;
get value(){
return this._value;
}
}
当有人试图设置值时,TypeScrip会给他们一个错误:Cannot assign to value because it is a read-only property.
这很好,但如果我还想要运行时判断,并在有人试图设置值时抛出错误,该怎么办?这有可能吗?
我有这样的东西:
class Computed<Value> {
_value: Value;
get value(){
return this._value;
}
}
当有人试图设置值时,TypeScrip会给他们一个错误:Cannot assign to value because it is a read-only property.
这很好,但如果我还想要运行时判断,并在有人试图设置值时抛出错误,该怎么办?这有可能吗?
只要您使用JavaScript strict mode(无论是通过"use strict"
指令还是在始终启用严格模式的上下文中,如在类内部),则[当您try 为仅限getter的属性赋值时将出现运行时错误](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#failing_to_assign_to_object_properties).这意味着您编写的代码将提供您正在寻找的运行时错误:
"use strict";
class Computed<V> {
_value: V;
constructor(v: V) {
this._value = v; // I added this so it's easier to initialize
}
get value() {
return this._value;
}
}
const v = new Computed(123);
v.value = 2; // error
// compile-time error: Cannot assign to 'value' because it is a read-only property.
// also, RUNTIME ERROR! ? TypeError: setting getter-only property "value"
如果出于某种原因,这还不够,您总是可以显式地创建一个抛出您想要的错误的setter,至少因为tyescript 5.1引入了对unrelated types for getters and setters的支持,所以getter类型保持不变,而setter需要the impossible never
type,所以您也不能在编译时调用它:
class Computed<V> {
_value: V;
constructor(v: V) {
this._value = v;
}
set value(x: never) {
throw new TypeError("hey, don't do that")
}
get value(): V { // explicitly annotate return type
return this._value;
}
}
const v = new Computed(123);
v.value = 2; // error
// compile-time error: Type 'number' is not assignable to type 'never'.
// also, RUNTIME ERROR! ? TypeError: hey, don't do that