DEV Community

Lior Amsalem
Lior Amsalem

Posted on

TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules

TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules

TypeScript is a powerful programming language that builds on JavaScript by adding static types. This enables developers to catch errors at compile time, rather than at runtime. Types are essentially labels that describe the shape of data or the type of variable. Understanding types is crucial for writing robust TypeScript applications. If you're interested in delving deeper into TypeScript or wish to learn how to use AI tools like gpteach to streamline your coding journey, I recommend subscribing or following my blog!

In TypeScript, a superset language means that it encompasses all features of JavaScript, while also introducing additional capabilities like typings and interfaces. This makes TypeScript an ideal choice for developers aiming to write clearer, more maintainable code.

Understanding TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules.

The error TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules occurs when you try to use the await keyword in a context where it isn't permitted. The await keyword is used to pause the execution of an async function until a Promise is resolved or rejected. This type of control flow is particularly useful in handling asynchronous operations, like API calls.

Important to know!

  • To use await, the enclosing function must be declared with the async keyword.
  • Only functions declared inside async functions or at the module level are allowed to utilize await.

Here’s an example that will trigger the TS1308 error:

function fetchData() {
    const data = await fetch('https://api.example.com/data'); // TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules.
}
Enter fullscreen mode Exit fullscreen mode

Fixing the Error

To fix the TS1308 error, you need to ensure that await is inside an async function. Here's how you can modify the code to resolve the error:

async function fetchData() {
    const data = await fetch('https://api.example.com/data'); 
    console.log(data);
}
Enter fullscreen mode Exit fullscreen mode

Now the function fetchData is declared as async, allowing you to use await correctly.

Important to know!

  • You can only use await at the top level of modules in modern JavaScript/TypeScript environments.

Using await in a non-async context results in a compile-time error, which is part of TypeScript’s design to enforce better coding practices.

Common Scenarios and Alternatives

  1. Using Await in Loops: Using await in for loops can also lead to performance issues since each iteration waits for the previous one to resolve. It’s better to use Promise.all in these cases. Here’s an incorrect example:
   async function fetchMultipleData() {
       for (let id of [1, 2, 3]) {
           const response = await fetch(`https://api.example.com/data/${id}`); // Can lead to performance issues
       }
   }
Enter fullscreen mode Exit fullscreen mode

Instead, you can refactor it as:

   async function fetchMultipleData() {
       const promises = [1, 2, 3].map(id => fetch(`https://api.example.com/data/${id}`));
       const responses = await Promise.all(promises); // Correct use of await
   }
Enter fullscreen mode Exit fullscreen mode

FAQ: Understanding TS1308

Q: Why can’t I use 'await' outside of an async function?

A: The 'await' expression is designed to pause execution until a Promise is resolved, and this functionality only makes sense in the context of an async function.

Q: Can I use 'await' in regular functions?

A: No, that will cause TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules. You must declare your function with async.

Conclusion

In summary, the TS1308 error can be easily avoided by ensuring that all await expressions are used within async functions or at the top levels of modules. Understanding the relationship between async functions and await statements is essential for leveraging TypeScript’s powerful features effectively. Remember, any attempt to use await improperly will lead to the TS1308 error: 'await' expressions are only allowed within async functions and at the top levels of modules, so always check the context in which you are writing your asynchronous code.

If you have more questions about TypeScript or want to learn in-depth about types, interfaces, or enums, feel free to reach out!

Top comments (0)