Construindo uma API REST com TypeScript e Express

TypeScript e Express são uma combinação poderosa para construir APIs REST robustas. TypeScript fornece segurança de tipo, melhores ferramentas e experiência de desenvolvimento aprimorada, enquanto Express é uma estrutura web minimalista para Node.js. Este guia explicará as etapas para construir uma API REST usando TypeScript e Express.

Configurando o Projeto

Comece criando um novo diretório para o projeto e inicializando um aplicativo Node.js.

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

Em seguida, instale as dependências necessárias para Express e TypeScript.

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

Crie um arquivo tsconfig.json para configurar o TypeScript. Execute o seguinte comando:

npx tsc --init

Modifique o arquivo tsconfig.json para atender às necessidades do projeto, habilitando opções como "strict", "esModuleInterop" e definindo o diretório de saída como "dist".

Criando o Servidor Expresso

Crie uma nova pasta chamada src e dentro dela, crie um arquivo chamado index.ts. Este arquivo servirá como ponto de entrada para o servidor Express.

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 and Express!');
});

app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

Para executar o servidor, use o seguinte comando:

npx ts-node src/index.ts

Definindo rotas de API

Crie uma nova pasta dentro de src chamada routes. Nessa pasta, crie um arquivo chamado userRoutes.ts para definir rotas para lidar com solicitações relacionadas ao usuário.

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

const router = Router();

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

router.post('/users', (req: Request, res: Response) => {
  const user = req.body;
  res.json({ message: 'User created', user });
});

export default router;

No arquivo index.ts, importe o userRoutes e use-o no aplicativo.

import userRoutes from './routes/userRoutes';

app.use('/api', userRoutes);

Criando uma camada de controlador e serviço

Organize o código criando camadas separadas para controladores e serviços. Crie duas novas pastas dentro de src: controllers e services.

Na pasta controllers, crie um arquivo chamado userController.ts.

import { Request, Response } from 'express';
import { getAllUsers, createUser } from '../services/userService';

export const getUsers = (req: Request, res: Response) => {
  const users = getAllUsers();
  res.json(users);
};

export const addUser = (req: Request, res: Response) => {
  const newUser = req.body;
  const user = createUser(newUser);
  res.json(user);
};

Na pasta services, crie um arquivo chamado userService.ts.

interface User {
  id: number;
  name: string;
}

let users: User[] = [];

export const getAllUsers = (): User[] => {
  return users;
};

export const createUser = (user: User): User => {
  users.push(user);
  return user;
};

Atualize userRoutes.ts para usar estes controladores:

import { Router } from 'express';
import { getUsers, addUser } from '../controllers/userController';

const router = Router();

router.get('/users', getUsers);
router.post('/users', addUser);

export default router;

Testando a API REST

Para testar a REST API, use uma ferramenta como Postman ou curl para enviar solicitações aos endpoints. Inicie o servidor e faça uma solicitação GET para /api/users e uma solicitação POST para /api/users com um payload JSON.

Conclusão

Seguindo essas etapas, uma API REST pode ser criada usando TypeScript e Express. TypeScript adiciona segurança de tipo e uma melhor experiência de desenvolvimento, enquanto Express fornece uma estrutura simples e poderosa para construir serviços RESTful. Essa configuração pode ser aprimorada ainda mais adicionando validação, tratamento de erros e lógica de negócios mais complexa.