为什么我的 getter/setter 没有用 TypeScript 编译?

Why are my getter/setter not compiling in TypeScript?

我有一个 class 定义了以下 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"))(); error TS2322: Type 'Promise' is not assignable to type 'string'.

明确地说,getter 单独编译很好:

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

我的代码有什么问题?

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

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

的 return 的类型不同,它将停止工作

您可以改为创建 属性,即 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)
  }
}