at backyard

Color my life with the chaos of trouble.

TypeScriptを使っていて、 Type 'void' is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value. というエラーがでたとき

Type 'void' is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value.

自分がまだまだTypeScriptを書き慣れていないのと、意外とググってみてもサクッと答えにたどり着かなかったので(自分の調べ方が悪い可能性は大いにあり)、一応備忘録としてこのエラーの内容と対応法を書き残しておく。
(もしかしたら書き残しておくほどのことでもないので、わざわざ書いていないのかもしれないが...😱)

ちなみに、上のエラーメッセージのvoidのところには返そうと思っている型などが入るので、人によっては微妙に異なるメッセージになると思う。

下記のような関数を書いていて、タイトルにあるエラーメッセージが出た

async function sayHello(): void {
  console.log('Hello!');
}

エラーメッセージの内容を見ればすぐに分かるのだが、async functionなのに返り値がPromiseじゃないよというわけである。
ではPromiseが返り値の場合はどう書けばよいのかというと、Promise<型>という感じになる

async function sayHello(): Promise<void> {
  console.log('Hello!');
}

もし文字列を返り値として返したい場合は下記のようになる。

async function sayHello(): Promise<string> {
  return 'Hello!';
}

他にObjectとして返したい場合は下記のようになる

interface userObj {
  name: string,
  age: number
}

async function getUser(): Promise<userObj> {
  return { name: 'John', age: 20 }
}