如何在 Typescript 中使用 Object.defineProperty 作为吸气剂?

How to use Object.defineProperty for getters in Typescript?

我使用了下面 JavaScript 中给出的实现。

class Base {
    installGetters() {
        Object.defineProperty(this, 'add', {
            get() {
                return 5;
            }
        });
    }
}

class New extends Base {
    constructor() {
        super();
        this.installGetters();
    }

    someAddition() {
        return 10 + this.add;
    }
}

我在父函数 class - Base 中定义了 getter 属性 add 并在其中使用了 属性 child class New 在调用 child class 构造函数中的 installGetters() 函数之后。这适用于 JavaScript,但 this.add 在 Typescript 的情况下会抛出错误。任何帮助将不胜感激。

我这样做的主要动机是我想将一个对象传递给 installGetters() 以便它可以生成多个 getters,对象键是 getter 名称和从相应的 getter 函数返回的值。

这在 JavaScript 中有效,所以我的主要好奇心是这在 TypeScript 中是不可能的还是我做错了什么。

原因很可能是 typescript 不知道您添加的 getter。没有打字告诉打字稿这个 getter 存在并且打字稿无法神奇地知道你添加了 getter 函数以及它看起来像什么。要么在基础 class 中定义 getter ,要么在不可能的情况下,除了将其转换为 any.

之外别无他法。
someAddition() {
  return 10 + (this as any).add
}

虽然这是一个非常奇怪的模式,但我会为您的实际问题提供答案。

TypeScript 不够聪明,无法根据在子类构造函数上调用的方法推断出实际的 Base 类型,因此您必须 declare 它:

declare readonly add: number;

TypeScript playground

应用继承后,我建议使用 protected:

protected members are only visible to subclasses of the class they’re declared in.

class Base {
  protected add!: number;
  installGetters() {
    this.add = 5;
  }
}

与您的问题相关的问题:https://github.com/microsoft/TypeScript/issues/28694