在类中强制转换私有成员类型

casting a private members type in a class

提问人:Yakiyo 提问时间:2/15/2023 更新时间:2/15/2023 访问量:52

问:

我正在使用一个类编写 Rust 的 Result 枚举的简单打字稿端口

class Result<T, E> {
  private value: T | E;
  private _ok: boolean;

  private constructor(f: () => T) {
    try {
      this.value = f();
      this._ok = true;
    } catch (e) {
      this.value = e as E;
      this._ok = false;
    }
  }

  static from<T, E>(f: () => T) {
    return new Result<T, E>(f);
  }

  is_ok(): this['value'] is T {
    return this._ok;
  }

  unwrap(): T {
    if (this.is_ok()) return this.value as T;
    throw new Error("some error");
  }
}

当 is_ok 返回 true 时,我想断言 value 属性是 T,否则是 E,is_ok为 false,这意味着该值是错误的。

但是使用使打字稿抛出一个错误,说无法访问私有值,this['value']enter image description here

再次使用抛出不同的错误 enter image description here 我该如何解决这个问题?可以只使用每种方法,但它不会在用户端解决它,我相信应该有一种更糟糕的方法。任何帮助都是值得赞赏的this is { value: T }value as T

TypeScript 型转换

评论

1赞 jcalz 2/15/2023
请将代码/日志/错误的图像替换为纯文本版本。
0赞 jcalz 2/15/2023
您无法通过类型系统轻松访问操作属性。要么做它,要么尝试以不同的方式说同样的话,也许就像这个游乐场链接中所示。这符合您的需求吗?如果是这样,我会写一个答案来解释;如果没有,我错过了什么?privatepublic
0赞 Yakiyo 2/15/2023
这实际上对我有用,我不明白它在做什么。将鼠标悬停在它上面是推断值,因为这意味着什么?T | (T & E)
0赞 jcalz 2/15/2023
它正在缩小从 到 ;有时,用户定义的类型保护函数使用交集来缩小范围(如果编译器不能完全确定缩小的类型是原始类型的子类型,它将使用交集),因此,which reduce to which reduce to which reduce to which reduce to .这等价于 ,但编译器不会主动减少它。这有意义吗?当我有机会时,我会写一个完整的答案。Result<T, E>Result<T, E> & Result<T, never>value(T | E) & (T | never)(T | E) & T(T & T) | (E & T)T | (E & T)T

答: 暂无答案