Почему мой метод получения / установки не компилируется в TypeScript? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть класс со следующим определенным получателем / установщиком:

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();

Получатель помечен как неправильный из-за установщика, то есть, если последний удален, то получатель в порядке.

Ошибка следующая:

return (async () => await this.GetConfigParameter ("debugMode")) ();ошибка TS2322: тип «Обещание» не может быть назначен типу «строка».

Для ясности, только геттер скомпилирует нормально:

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

Что не так с моим кодом

1 Ответ

0 голосов
/ 20 ноября 2018

Так как ваш геттер содержит асинхронную операцию, нет способа сделать это напрямую 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)
  }
}
...