Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Error Narrowing in Async Code | Error Handling and Advanced Narrowing
Error Handling and Type Guards in TypeScript

bookError Narrowing in Async Code

12345678910111213141516
async function fetchUserData(userId: string): Promise<void> { try { const response = await fetch(`/api/users/${userId}`); if (!response.ok) { throw new Error(`Request failed with status: ${response.status}`); } const data = await response.json(); console.log("User data:", data); } catch (error: unknown) { if (error instanceof Error) { console.error("An error occurred:", error.message); } else { console.error("An unexpected error occurred."); } } }
copy

When working with asynchronous code in TypeScript, handling errors correctly is essential for building robust applications. Unlike synchronous code, async functions often deal with errors that can come from a variety of sources, including network failures, invalid responses, and unexpected runtime exceptions. In TypeScript, the type of the value caught in a catch block is always unknown when you use catch (error: unknown), which is a best practice to avoid unsafe assumptions about the error's structure.

Narrowing errors safely is crucial because you cannot guarantee that the caught error will always be an instance of the built-in Error class. For example, libraries or other code might throw strings, numbers, or custom objects. If you try to access properties like message or stack on an unknown value without narrowing, you risk runtime errors.

The recommended approach is to use the instanceof Error type guard inside your catch block. This check ensures that you are only accessing properties like message on objects that are actually instances of Error. If the error is not an Error, you can handle it generically, such as by logging a generic message or rethrowing the value. This pattern helps you avoid unsafe assumptions and keeps your error handling predictable and type-safe.

Avoid casting the error directly to Error or assuming its shape without a guard. Unsafe patterns, such as catch (error) { console.error(error.message); }, can introduce subtle bugs if a non-Error value is thrown. Always prefer explicit narrowing using type guards to keep your code safe and maintainable, especially in asynchronous workflows where the source and type of errors may be unpredictable.

question mark

Which is the safest way to access the message property of an error in a catch block in TypeScript?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 5.88

bookError Narrowing in Async Code

Scorri per mostrare il menu

12345678910111213141516
async function fetchUserData(userId: string): Promise<void> { try { const response = await fetch(`/api/users/${userId}`); if (!response.ok) { throw new Error(`Request failed with status: ${response.status}`); } const data = await response.json(); console.log("User data:", data); } catch (error: unknown) { if (error instanceof Error) { console.error("An error occurred:", error.message); } else { console.error("An unexpected error occurred."); } } }
copy

When working with asynchronous code in TypeScript, handling errors correctly is essential for building robust applications. Unlike synchronous code, async functions often deal with errors that can come from a variety of sources, including network failures, invalid responses, and unexpected runtime exceptions. In TypeScript, the type of the value caught in a catch block is always unknown when you use catch (error: unknown), which is a best practice to avoid unsafe assumptions about the error's structure.

Narrowing errors safely is crucial because you cannot guarantee that the caught error will always be an instance of the built-in Error class. For example, libraries or other code might throw strings, numbers, or custom objects. If you try to access properties like message or stack on an unknown value without narrowing, you risk runtime errors.

The recommended approach is to use the instanceof Error type guard inside your catch block. This check ensures that you are only accessing properties like message on objects that are actually instances of Error. If the error is not an Error, you can handle it generically, such as by logging a generic message or rethrowing the value. This pattern helps you avoid unsafe assumptions and keeps your error handling predictable and type-safe.

Avoid casting the error directly to Error or assuming its shape without a guard. Unsafe patterns, such as catch (error) { console.error(error.message); }, can introduce subtle bugs if a non-Error value is thrown. Always prefer explicit narrowing using type guards to keep your code safe and maintainable, especially in asynchronous workflows where the source and type of errors may be unpredictable.

question mark

Which is the safest way to access the message property of an error in a catch block in TypeScript?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 4
some-alt