为什么我的getter / setter无法在TypeScript中编译?

奥利维尔·马特罗(Olivier MATROT)

我有一个定义了以下getter / setter的类:

class ConfigStoreController {
    get debugMode() {
        return (async () => await this.GetConfigParameter("debugMode"))();
        }

    set debugMode(value: string) {
        (async () => await this.SetConfigParameter("debugMode", value))();
    }

    private async GetConfigParameter(parameter: string) {
        return await RX.Storage.getItem(parameter);
    }

    private async SetConfigParameter(param: string, value: string) {
        return await RX.Storage.setItem(param, value);
    }
}

export default new ConfigStoreController();

由于该setter,该getter被标记为不正确,也就是说,如果删除了后者,则该getter正常。

错误如下:

return(async()=>等待this.GetConfigParameter(“ debugMode”))(); 错误TS2322:类型'Promise'不能分配给类型'string'。

需要明确的是,仅吸气剂即可编译:

get debugMode() {
    return (async () => await this.GetConfigParameter("debugMode"))();
}

我的代码有什么问题?

提香·切尔尼科娃·德拉戈米尔

由于您的getter包含异步操作,因此无法直接重新运行它string如果将异步操作包装在匿名函数中,则没关系,该函数调用将返回Promise<string>这意味着属性的类型为Promise<string>

单独使用吸气剂是有效的,因为属性类型Promise<string>是没有问题的。如果您还有设置器,并且设置器的参数与返回的类型不同,则它将停止工作get

您可以创建一个Promise<string>替代属性

class ConfigStoreController {
  GetConfigParameter(p: string): Promise<string> {
    return Promise.resolve(p)
  }
  SetConfigParameter(p: string, value: string): Promise<void> {
    return Promise.resolve(void 0)
  }
  get debugMode() {
    return this.GetConfigParameter("debugMode");
  }

  set debugMode(value: Promise<string>) {
    // There is no way to wait for this operation to finish from the outside, this might be an issue
    // Also unhandled errors from the anonymous method are not handled and are not propagated to the caller, since the set is async
    (async () => this.SetConfigParameter("debugMode", await value))(); 
  }
}

更好的解决方案可能是离开吸气剂,set而改为使用方法:

class ConfigStoreController {
  GetConfigParameter(p: string): Promise<string> {
    return Promise.resolve(p)
  }
  SetConfigParameter(p: string, value: string): Promise<void> {
    return Promise.resolve(void 0)
  }
  get debugMode() {
    return this.GetConfigParameter("debugMode");
  }

  async setDebugMode(value: string) {
      this.SetConfigParameter("debugMode", await value)
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我可以在 Typescript 中设置 getter 属性的值?

为什么我的javascript getter / setter要求下划线?

为什么在PHP类中未调用我的getter(__get)?

为什么我应该避免在getter和setter中包装字段?

为什么我不能删除 Object.defineProperties 中定义的 getter/setter?

当 getter 方法为我做同样的工作时,为什么我需要有 setter 方法?

为什么Intellij默认的getter / setter模板删除我的布尔值“ is”变量名前缀?

为什么Java中的getter和setter方法很重要?

为什么我需要在 getter 方法中传播运算符?

为什么我不能在VueJS / Vuex中调用命名空间的getter?

为什么我不能再编译TypeScript?

Ruby-实例方法:为什么我可以不使用self而使用getter,而只能使用self进行setter

为什么我的fstream访问无法编译?

为什么我的Java代码无法编译

为什么我的React App无法编译?

为什么使用getter方法时,我们可以直接使用setter方法来访问私有变量在Java中?

为什么在Android的onMeasure方法之前调用setter / getter方法?

为什么要使用getter和setter / accessor?

为什么GSON使用字段而不使用getter / setter?

为什么要对doctrine2类使用getter setter

为什么从不同的“基础”调用getter和setter?

Typescript:如果属性值来自嵌套对象,为什么我的代码无法编译?

为什么我无法在 Angular 中订阅来自不同模块的 observable(而 setter 也可以)

为什么我的setter无法在匿名struct字段上工作?

TypeScript中模块上的getter / setter

没有类的Typescript中的Getter / Setter

为什么 A 中的类路径无法编译?

为什么 LaTeX 无法在 RMarkdown 中编译

为什么这些 getter/setter 中的 1 个起作用而其他的不起作用