web-dev-qa-db-ja.com

エラー:タイプは、Promise互換コンストラクターを参照しないため、ES5 / ES3で有効な非同期関数の戻りタイプではありません

この関数をTypeScriptで記述しました。

export class LoginService {

    async isLoggedIn(): boolean {
      const r = await this.http.get('http://localhost:3000/api/user/isLoggedIn').toPromise();
      return r.body;
    }

}

Angular 6アプリケーションを実行しようとすると、次のエラーメッセージが表示されます。

Src/app/login.service.ts(28,23)のエラー:エラーTS1055:タイプ 'boolean'は、Promise互換のコンストラクター値を参照しないため、ES5/ES3で有効な非同期関数の戻り型ではありません。

以前に他のアプリケーションでasync/awaitを使用したことがあります。

更新:私が答えたい質問は、「isLoggedIn」関数を取得してブール値を返すにはどうすればよいですか?

22
user275801

async関数は、定義によってのみプロミスを返すことができます-すべてのasync関数はプロミスを返します。ブール値を返すことはできません。

それがTypeScriptが伝えていることです。 async関数は、ブール値に解決されるプロミスを返すことができます。

return関数内でasyncする値は、async関数が返すプロミスの解決された値になります。したがって、async関数の戻り値の型はプロミス(ブール値に解決される)です。

isLoggedIn()の呼び出し元は、.then()を使用するか、awaitを使用する必要があります。

export class LoginService {

    async isLoggedIn(): Promise<any> {
      const r = await this.http.get('http://localhost:3000/api/user/isLoggedIn').toPromise();
      return r.body;
    }

}
16
jfriend00

エンドポイント/api/user/isLoggedInがブール値のみを返す場合、http getメソッドをキャストすることで以下を使用できるようになります。しかし、実際には、非同期関数からのみpromiseを返すことができます。

export class LoginService {
  async isLoggedIn(): Promise<boolean> {
    return this.http.get<boolean>('http://localhost:3000/api/user/isLoggedIn').toPromise();
  }
}

次のようなisLoggedIn()を消費する非同期関数を使用できます。

async doSomething() {
  const loggedIn: boolean = await service.isLoggedIn();
  if (loggedIn) {
    doThis();
  }    
}

このように呼ばれます

await doSomething();
0
Ian