DEV Community

Cover image for Go like error handling in TypeScript
Karan Pratap Singh
Karan Pratap Singh

Posted on

10 3

Go like error handling in TypeScript

In this article we'll learn about how we can handle our errors like Go with TypeScript.

Note: In TypeScript this is probably not a "best practice", or even a good practice at all but let's have fun experimenting nonetheless!

Let's take the following as an example.

import * as fs from 'fs/promises';

async function main(): Promise<void> {
  try {
    const result: Buffer = await fs.readFile('./package.json');
    // Do something with result
  } catch (error) {
    // Handle error
  }
}

main();
Enter fullscreen mode Exit fullscreen mode

In Go, this should look as below.

package main

import "io/ioutil"

func main() {
    data, err := ioutil.ReadFile("./package.json")

    if err != nil {
        // Handle error
    }

    // Do something with data
}
Enter fullscreen mode Exit fullscreen mode

Let's write our async handler helper function! This function basically returns a Tuple of result and error as TypeScript doesn't have multiple returns.

type Maybe<T> = T | null;

type AsyncResult = any;
type AsyncError = any;
type AsyncReturn<R, E> = [Maybe<R>, Maybe<E>];
type AsyncFn = Promise<AsyncResult>;

async function async<R = AsyncResult, E = AsyncError>(
  fn: AsyncFn
): Promise<AsyncReturn<R, E>> {
  try {
    const data: R = await fn;
    return [data, null];
  } catch (error) {
    return [null, error];
  }
}
Enter fullscreen mode Exit fullscreen mode

We can use our async utility as below. We can pass our Result and Error generics types.

import * as fs from 'fs/promises';

async function main(): Promise<void> {
  const fn: Promise<Buffer> = fs.readFile('./package.json');
  const [data, error] = await async<Buffer, NodeJS.ErrnoException>(fn);

  if (error) {
    // Handle error
  }

  // Do something with data
}

main();
Enter fullscreen mode Exit fullscreen mode

Perfect! We now have isolated our try/catch with Go like error handling pattern.

Jetbrains image

Is Your CI/CD Server a Prime Target for Attack?

57% of organizations have suffered from a security incident related to DevOps toolchain exposures. It makes sense—CI/CD servers have access to source code, a highly valuable asset. Is yours secure? Check out nine practical tips to protect your CI/CD.

Learn more

Top comments (2)

Collapse
 
foresthoffman profile image
Forest Hoffman

That's a fun exercise! XD

Collapse
 
gaurav5430 profile image
Gaurav Gupta

this is a legit pattern, we use this (without typescript) in our codebase to get rid of try catch at the calling site

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay