代码之家  ›  专栏  ›  技术社区  ›  Olivier MATROT

为什么我的getter/setter不在typescript中编译?

  •  2
  • Olivier MATROT  · 技术社区  · 5 年前

    我有一个定义了以下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被标记为不正确,也就是说,如果删除了setter,则getter正常。

    错误如下:

    返回(async()=>等待此.getconfigParameter(“debugMode”))(); 错误TS2322:类型“promise”不能分配给类型“string”。

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

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

    我的代码有什么问题?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    5 年前

    因为getter包含异步操作,所以无法直接重试。 string . 如果将异步操作包装在匿名函数中,则该函数调用将返回 Promise<string> . 这意味着属性的类型将是 承诺<字符串>

    getter单独工作,因为属性类型 承诺<字符串> 这不是问题。如果您还有一个setter,并且setter的参数的类型与 get .

    您可以创建一个 承诺<字符串> 相反。

    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)
      }
    }