Como escrever uma API REST em TypeScript em 30 minutos: guia passo a passo
Criar uma API REST é uma tarefa básica para qualquer desenvolvedor backend. Usar TypeScript adiciona tipagem estrita, melhora a legibilidade do código e reduz o número de erros. Neste artigo, vamos analisar como escrever uma API REST completa em TypeScript do zero em apenas 30 minutos. Você conhecerá Express, TypeORM e as melhores práticas de organização de código.
1. Configuração do projeto e instalação de dependências
Primeiro, crie um novo diretório e inicialize o projeto Node.js:
mkdir my-rest-apicd my-rest-apinpm init -yInstale os pacotes necessários:
npm install express reflect-metadata typeorm sqlite3npm install -D typescript @types/node @types/express ts-node nodemonCrie o arquivo tsconfig.json para configuração do TypeScript:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "skipLibCheck": true }, "include": ["src/**/*"]}2. Criação da estrutura básica e ponto de entrada
Organize a estrutura de pastas da seguinte forma:
src/— código principalsrc/controllers/— controladoressrc/entities/— entidades do banco de dadossrc/routes/— rotas
Crie o arquivo src/index.ts — ponto de entrada da aplicação:
import "reflect-metadata";import express from "express";import { AppDataSource } from "./data-source";import { userRoutes } from "./routes/userRoutes";
const app = express();const PORT = process.env.PORT || 3000;
app.use(express.json());
AppDataSource.initialize() .then(() => { console.log("Database connected"); app.use("/api/users", userRoutes); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); }) .catch((error) => console.log(error));Agora crie src/data-source.ts para configuração do TypeORM:
import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "sqlite", database: "database.sqlite", synchronize: true, logging: false, entities: [User],});3. Definição da entidade e do controlador
Crie o arquivo src/entities/User.ts — modelo de usuário:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id!: number;
@Column() name!: string;
@Column() email!: string;
@Column({ default: true }) isActive!: boolean;}Agora vamos criar o controlador src/controllers/userController.ts:
import { Request, Response } from "express";import { AppDataSource } from "../data-source";import { User } from "../entities/User";
const userRepository = AppDataSource.getRepository(User);
export const getUsers = async (req: Request, res: Response) => { try { const users = await userRepository.find(); res.json(users); } catch (error) { res.status(500).json({ message: "Error fetching users" }); }};
export const getUserById = async (req: Request, res: Response) => { try { const user = await userRepository.findOneBy({ id: parseInt(req.params.id) }); if (!user) { return res.status(404).json({ message: "User not found" }); } res.json(user); } catch (error) { res.status(500).json({ message: "Error fetching user" }); }};
export const createUser = async (req: Request, res: Respo