我有这样的东西:

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

Playground link to code

Typescript相关问答推荐

React Hook中基于动态收件箱定义和断言回报类型

APP_INITIALIZER—TypeError:appInits不是函数

在这种情况下,如何获得类型安全函数的返回值?

TypeScript将键传递给新对象错误

在配置对象上映射时,类型脚本不正确地推断函数参数

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

创建一个根据布尔参数返回类型的异步函数

使某些(嵌套)属性成为可选属性

如何在Angular 12中创建DisplayBlock组件?

如果字符串文字类型是泛型类型,则用反引号将该类型括起来会中断

通过按键数组拾取对象的关键点

为什么&;(交集)运算符会删除不相交的属性?

如何将父属性类型判断传播到子属性

自定义 Select 组件的类型问题:使用带逗号的泛型类型<;T与不带逗号的<;T&>;时出错

在正常函数内部调用异步函数

使用RXJS获取数据的3种不同REST API

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

如何创建允许使用带有联合类型参数的Array.from()的TS函数?

可选通用映射器函数出错

从平面配置推断嵌套递归类型