Building RESTful APIs with TypeScript and Express

Muke Johnbaptist

Muke Johnbaptist

August 24, 2024

Building RESTful APIs with TypeScript and Express

Introduction

Building RESTful APIs is a fundamental skill for any backend developer. When combined with TypeScript, you get the benefits of static typing, better code organization, and a more robust development experience. In this blog, we’ll explore how to build a RESTful API using TypeScript and Express.js.

Prerequisites

Before we dive in, make sure you have the following installed on your machine:

  • Node.js
  • npm or Yarn
  • Basic knowledge of TypeScript and Express.js

Setting Up the Project

First, let’s initialize a new Node.js project:

mkdir ts-express-api
cd ts-express-api
npm init -y

Next, install the necessary dependencies:

npm install express
npm install typescript ts-node-dev @types/node @types/express --save-dev

Now, initialize TypeScript in your project:

npx tsc --init

This will create a tsconfig.json file in your project directory.

Creating the Express Server

Now, let’s create a basic Express server. Create a new file named index.ts:

import express, { Request, Response } from 'express';

const app = express();
const port = process.env.PORT || 3000;

app.use(express.json());

app.get('/', (req: Request, res: Response) => {
  res.send('Hello, TypeScript with Express!');
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

Defining Routes

Let’s define some basic routes for our API. We’ll create routes for managing a simple resource, such as Books.

interface Book {
  id: number;
  title: string;
  author: string;
}

let books: Book[] = [
  { id: 1, title: '1984', author: 'George Orwell' },
  { id: 2, title: 'The Great Gatsby', author: 'F. Scott Fitzgerald' },
];

// Get all books
app.get('/books', (req: Request, res: Response) => {
  res.json(books);
});

// Get a book by ID
app.get('/books/:id', (req: Request, res: Response) => {
  const book = books.find((b) => b.id === parseInt(req.params.id));
  if (book) {
    res.json(book);
  } else {
    res.status(404).send('Book not found');
  }
});

// Add a new book
app.post('/books', (req: Request, res: Response) => {
  const newBook: Book = req.body;
  newBook.id = books.length + 1;
  books.push(newBook);
  res.status(201).json(newBook);
});

// Update a book by ID
app.put('/books/:id', (req: Request, res: Response) => {
  const index = books.findIndex((b) => b.id === parseInt(req.params.id));
  if (index !== -1) {
    books[index] = { ...books[index], ...req.body };
    res.json(books[index]);
  } else {
    res.status(404).send('Book not found');
  }
});

// Delete a book by ID
app.delete('/books/:id', (req: Request, res: Response) => {
  books = books.filter((b) => b.id !== parseInt(req.params.id));
  res.status(204).send();
});

Testing the API

You can now run your server using:

npx ts-node-dev index.ts

Use a tool like Postman or curl to test the endpoints:

  • GET /books to fetch all books
  • GET /books/:id to fetch a specific book
  • POST /books to add a new book
  • PUT /books/:id to update a book
  • DELETE /books/:id to delete a book

Conclusion

In this blog, we’ve built a simple RESTful API using TypeScript and Express.js. This setup provides a strong foundation for building more complex APIs, with the added benefits of TypeScript’s type safety and improved developer experience. As you continue developing your API, consider adding features like authentication, database integration, and more advanced error handling.

Further Reading

Final Thoughts

TypeScript enhances the development of RESTful APIs by providing static types, which help catch errors early in the development process. As you grow your API, consider adopting TypeScript to ensure scalability and maintainability.

This blog provides a comprehensive guide to building a RESTful API with TypeScript and Express, complete with code examples, step-by-step instructions, and additional resources for further learning.