Skip to content

Instantly share code, notes, and snippets.

@eonist
Created July 8, 2025 11:40
Show Gist options
  • Save eonist/21d01aefa6bec32adfcc953d693b0de1 to your computer and use it in GitHub Desktop.
Save eonist/21d01aefa6bec32adfcc953d693b0de1 to your computer and use it in GitHub Desktop.
Typescript error best practise

TypeScript error handling involves several best practices that leverage the language's type system to create more robust and maintainable applications. Here are the key strategies and techniques:

Using Try-Catch Blocks Effectively

The traditional try-catch block remains fundamental for error handling in TypeScript[2]. However, TypeScript enhances this with type safety considerations:

try {
  // Code that might throw an error
} catch (error: unknown) {
  if (typeof error === "string") {
    console.log("Error: ", error);
  } else {
    console.log("Unknown error");
  }
}

Instead of accepting errors as any type, use unknown and narrow it down inside the catch block[5]. This forces you to check the type before accessing properties, ensuring safer error handling[5].

Creating Custom Error Classes

Custom error classes greatly enhance code clarity by providing specific error scenarios with additional properties and methods[2]:

class DatabaseError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "DatabaseError";
  }
}

try {
  // Code that interacts with a database
} catch (error) {
  if (error instanceof DatabaseError) {
    // Handle the database-specific error
  } else {
    // Handle other errors
  }
}

Leveraging TypeScript's Type System

Strict Mode Configuration

Enable strict type checking to catch errors early before they enter your codebase[1]:

{
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true
  }
}

Type Guards and Assertions

Use TypeScript's type system to resolve type conflicts and manage null/undefined values[1]. Optional chaining (?.) and nullish coalescing (??) help avoid null reference errors:

let user = {
  name: "John",
  address: {
    street: "123 Main St"
  }
};

console.log(user.address?.street); // Safe access
console.log(user.address?.city ?? "Unknown"); // Default value

Handling Type Conflicts

Type Aliases

Use type aliases to resolve conflicts between library types[1]:

type UserA = import('library-a').User;
type UserB = import('library-b').User;

Type Intersection

Combine type definitions using the & operator[1]:

type User = import('library-a').User & import('library-b').User;

Essential Best Practices

Error Logging and Monitoring

  • Always handle errors, even if it's just to log them[5]
  • Include relevant information like error messages, stack traces, and contextual details[4]
  • In development, log errors with stack traces; in production, avoid logging sensitive information[5]

Type Safety

  • Leverage TypeScript's static type system to catch errors at compile-time rather than runtime[4]
  • Use explicit type annotations to prevent type mismatches[4]
  • Validate input parameters before making function calls[4]

Code Quality

  • Write comprehensive unit tests covering various scenarios and edge cases[4]
  • Maintain consistent coding conventions and use descriptive variable and function names[4]
  • Use linters and code analyzers to detect common error-prone patterns[4]

Error Boundaries

For React applications, implement error boundaries to catch errors in component lifecycles and prevent entire UI crashes[2][4].

Documentation and Collaboration

  • Document your error handling strategies clearly[4]
  • Engage in code reviews to identify potential errors and improve handling methods[4]
  • Stay updated with TypeScript's latest features and error handling capabilities[4]

Graceful Degradation

If an error is non-critical, provide fallback functionality instead of crashing the entire application[5]. Always clean up resources like database connections or file handles in finally blocks or using proper resource management patterns[5].

These practices help create more predictable, maintainable, and robust TypeScript applications by combining the language's type safety features with proven error handling techniques.

[1] https://www.convex.dev/typescript/optimization/typescript-error-type [2] https://clouddevs.com/typescript/error-handling-strategies/ [3] https://palantir.com/docs/foundry/functions/typescript-error-types/ [4] https://www.zipy.ai/blog/typescript-errors [5] https://betacraft.com/2025-01-15-js-ts-error-handling/ [6] https://engineering.udacity.com/handling-errors-like-a-pro-in-typescript-d7a314ad4991 [7] https://www.dhiwise.com/post/typescript-error-handling-pitfalls-and-how-to-avoid-them [8] https://www.reddit.com/r/typescript/comments/1gi5zul/error_handling_in_typescript/ [9] https://dev.to/noah-00/no-more-trycatch-a-better-way-to-handle-errors-in-typescript-5hbd [10] https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment