Enforces consistent returning of awaited values (return-await)
Returning an awaited promise can make sense for better stack trace information as well as for consistent error handling (returned promises will not be caught in an async function try/catch).
Rule Details
This rule builds on top of the eslint/no-return-await rule.
It expands upon the base rule to add support for optionally requiring return await in certain cases.
How to Use
{
  // note you must disable the base rule as it can report incorrect errors
  "no-return-await": "off",
  "@typescript-eslint/return-await": "error"
}
Options
type Options = 'in-try-catch' | 'always' | 'never';
const defaultOptions: Options = 'in-try-catch';
in-try-catch
Requires that a returned promise must be awaited in try-catch-finally blocks, and disallows it elsewhere.
Specifically:
- if you 
returna promise within atry, then it must beawaited. - if you 
returna promise within acatch, and there is nofinally, then it must not beawaited. - if you 
returna promise within acatch, and there is afinally, then it must beawaited. - if you 
returna promise within afinally, then it must not beawaited. 
Examples of code with in-try-catch:
- โ Incorrect
 - โ Correct
 
async function invalidInTryCatch1() {
  try {
    return Promise.resolve('try');
  } catch (e) {}
}
async function invalidInTryCatch2() {
  try {
    throw new Error('error');
  } catch (e) {
    return await Promise.resolve('catch');
  }
}
async function invalidInTryCatch3() {
  try {
    throw new Error('error');
  } catch (e) {
    return Promise.resolve('catch');
  } finally {
    console.log('cleanup');
  }
}
async function invalidInTryCatch4() {
  try {
    throw new Error('error');
  } catch (e) {
    throw new Error('error2');
  } finally {
    return await Promise.resolve('finally');
  }
}
async function invalidInTryCatch5() {
  return await Promise.resolve('try');
}
async function invalidInTryCatch6() {
  return await 'value';
}
async function validInTryCatch1() {
  try {
    return await Promise.resolve('try');
  } catch (e) {}
}
async function validInTryCatch2() {
  try {
    throw new Error('error');
  } catch (e) {
    return Promise.resolve('catch');
  }
}
async function validInTryCatch3() {
  try {
    throw new Error('error');
  } catch (e) {
    return await Promise.resolve('catch');
  } finally {
    console.log('cleanup');
  }
}
async function validInTryCatch4() {
  try {
    throw new Error('error');
  } catch (e) {
    throw new Error('error2');
  } finally {
    return Promise.resolve('finally');
  }
}
async function validInTryCatch5() {
  return Promise.resolve('try');
}
async function validInTryCatch6() {
  return 'value';
}
always
Requires that all returned promises are awaited.
Examples of code with always:
- โ Incorrect
 - โ Correct
 
async function invalidAlways1() {
  try {
    return Promise.resolve('try');
  } catch (e) {}
}
async function invalidAlways2() {
  return Promise.resolve('try');
}
async function invalidAlways3() {
  return await 'value';
}
async function validAlways1() {
  try {
    return await Promise.resolve('try');
  } catch (e) {}
}
async function validAlways2() {
  return await Promise.resolve('try');
}
async function validAlways3() {
  return 'value';
}
never
Disallows all awaiting any returned promises.
Examples of code with never:
- โ Incorrect
 - โ Correct
 
async function invalidNever1() {
  try {
    return await Promise.resolve('try');
  } catch (e) {}
}
async function invalidNever2() {
  return await Promise.resolve('try');
}
async function invalidNever3() {
  return await 'value';
}
async function validNever1() {
  try {
    return Promise.resolve('try');
  } catch (e) {}
}
async function validNever2() {
  return Promise.resolve('try');
}
async function validNever3() {
  return 'value';
}
Attributes
- โ Recommended
 - ๐ง Fixable
 - ๐ญ Requires type information