没有类的 Typescript 中的 Getter/Setter

nra*_*ako 3 javascript typescript

这里是做题的打字稿getter / setter方法取样:从2015年开始2018年1月2018年9月,等等。

也就是说,在 vanilla JS 对象中为 getter/setter 定义 Typescript 类型的推荐方法是什么?也就是说,我想要一个没有class语法的普通旧 javascript 对象,并了解打字的最佳实践。界面是这样的——

interface Store {
   activeEvent: Date
}
Run Code Online (Sandbox Code Playgroud)

这个对象的一些限制 -

new实例化

没有重复 - 这不起作用

const Store: Store = {
  activeEvent: new Date(),
  get activeEvent() {
    return this.activeEvent;
  },
}
Run Code Online (Sandbox Code Playgroud)

没有悬垂的下划线。Airbnb 的 eslint 配置对此大喊大叫 -

const Store: Store = {
  _activeEvent: {},
  get activeEvent() {
    return this._activeEvent;
  },
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望有默认值(也就是说,如果我放下密钥,错误就会消失,但在第一次访问时activeEvent未定义)。我想我可以初始化并返回 this.activeDate如果它是未定义的,这有效,但get实际上get&set在那种情况下 -

 get activeDate() {
    if(this.activeDate){ return this.activeDate }
    const date = new Date()
    this.activeDate = date;
    return date;
  },
Run Code Online (Sandbox Code Playgroud)

我宁愿不使用 getter 和 setter 生成重复的键,只是为了拥有 getter 和 setter。

有趣的是,getter/setter 具有相同键的事实不会出错,只是当它们匹配私有变量时,这让我觉得我做错了什么。我很欣赏任何见解。

getter setter 错误

sud*_*ian 6

将您的对象创建包装在一个闭包中,并将不属于该接口的一部分的变量保留在对象之外:

function createStore() {
  let activeEvent = new Date();
  return {
    get activeEvent() {
      return activeEvent;
    },
  };
}
Run Code Online (Sandbox Code Playgroud)

这避免了您当前遇到的名称冲突/无限循环问题 - 您返回的对象有一个.activeEventgetter,但支持它的变量位于对象之外,在createStore函数的范围内。