【问题标题】:Why are my getter/setter not compiling in TypeScript?为什么我的 getter/setter 没有在 TypeScript 中编译?
【发布时间】:2019-04-22 21:48:48
【问题描述】:

我有一个定义了以下 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();

getter因为setter而被标记为不正确,即如果后者被移除,那么getter就OK了。

错误如下:

return (async () => await this.GetConfigParameter("debugMode"))(); 错误 TS2322:类型“承诺”不可分配给类型“字符串”。

要清楚,单独的 getter 编译得很好:

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

我的代码有什么问题?

【问题讨论】:

    标签: typescript async-await getter-setter


    【解决方案1】:

    由于您的 getter 包含异步操作,因此无法直接返回 string。是否将异步操作包装在匿名函数中并不重要,该函数调用将返回Promise<string>。这意味着属性的类型将是Promise<string>

    getter 单独起作用,因为属性类型是Promise<string>,这不是问题。如果您还有一个 setter 并且 setter 的参数与 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))(); 
      }
    }
    

    更好的解决方案可能是离开 getter 并使用 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)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 2016-02-18
      • 2017-01-01
      • 2023-03-31
      相关资源
      最近更新 更多