如何在 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;
应用继承后,我建议使用 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
我使用了下面 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;
应用继承后,我建议使用 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