DEV Community

Cover image for Why Async Functions in TypeScript Always Return a Promise
Arka Chakraborty
Arka Chakraborty

Posted on

Why Async Functions in TypeScript Always Return a Promise

📌Intro

You write a simple asyncfunction, return 42, and suddenly TypeScript yells:
“Type 'number' is not assignable to type 'Promise'.”
Why can’t an async function just return a value? Let’s break it down.


đź§ Context & Why:

The asynckeyword in TypeScript (and JavaScript) changes how the function behaves:

  • Every asyncfunction always returns aPromise<T>.
  • Even if you return a raw value, it’s wrapped in Promise.resolve(value).

Examples:

// Normal function
function getFavoriteNumber(): number {
  return 26;
}

// Async function
async function getFavoriteNumber(): Promise<number> {
  return 26; // Actually Promise.resolve(26)
}

// Arrow version
const getFavoriteNumber = async (): Promise<number> => {
  return 26;
};

Enter fullscreen mode Exit fullscreen mode

If you try:

async function getFavoriteNumber(): number {
  return 26;
}

Enter fullscreen mode Exit fullscreen mode

TypeScript error:

Type 'number' is not assignable to type 'Promise<number>'.

Enter fullscreen mode Exit fullscreen mode

Real-Life Example:

You might start with a hardcoded value, but later fetch it from an API. Making it async upfront saves refactoring:

const getFavoriteNumber = async (): Promise<number> => {
  const res = await fetch("/api/fav-number");
  const data = await res.json();
  return data.number;
};

Enter fullscreen mode Exit fullscreen mode

💡Think of asyncas a “Promise factory.” Whatever you return gets gift-wrapped in a Promise.

Top comments (0)