Por que TypeScript não é apenas moda, mas uma necessidade
\n\nQuando a Microsoft apresentou o TypeScript em 2012, poucos acreditavam que a extensão do JavaScript se tornaria o padrão da indústria. Hoje, TypeScript não é apenas "mais uma linguagem", mas um ecossistema completo que muda a abordagem ao desenvolvimento. De acordo com o State of JS 2023, mais de 70% dos desenvolvedores entrevistados usam TypeScript em seus projetos, e esse número continua crescendo.
\n\nMas não se trata apenas de tipagem estática. A verdadeira magia do TypeScript se revela através de bibliotecas que usam seus recursos ao máximo. Esqueça as chatas "embalagens" para pacotes JavaScript — vamos falar sobre ferramentas verdadeiramente TypeScript-native que farão seu código cantar.
\n\nNeste artigo, vamos explorar as bibliotecas TypeScript mais interessantes e úteis que você deve adicionar ao seu arsenal em 2024. Da validação de dados ao trabalho com bancos de dados — prepare-se para se surpreender.
\n\nZod: o rei da validação de dados
\n\nSe você já escreveu código para verificar dados de entrada manualmente, sabe como isso é tedioso. O Zod resolve esse problema de forma elegante e tipada.
\n\nPor que Zod, e não Joi ou Yup?
\n\nA principal vantagem do Zod é a abordagem TypeScript-first. Todos os esquemas inferem tipos automaticamente, e você não precisa duplicar tipos manualmente. Nada de typeof, nada de interfaces que precisam ser sincronizadas com validadores.
import { z } from 'zod';\n\n// Criando um esquema\nconst UserSchema = z.object({\n name: z.string().min(2, 'O nome deve ter mais de 2 caracteres'),\n email: z.string().email('Email inválido'),\n age: z.number().int().positive().optional(),\n role: z.enum(['admin', 'user', 'moderator']).default('user'),\n});\n\n// Obtendo o tipo automaticamente\ntype User = z.infer<typeof UserSchema>;\n// { name: string; email: string; age?: number; role: "admin" | "user" | "moderator" }\n\n// Validação de dados\nconst result = UserSchema.safeParse({\n name: 'Ana',\n email: 'ana@exemplo.com',\n age: 25,\n});\n\nif (!result.success) {\n console.error(result.error.errors);\n} else {\n // result.data — objeto totalmente tipado\n console.log(result.data.name); // string\n}\n\nO Zod também suporta esquemas complexos: uniões (union), interseções (intersection), tipos recursivos e até transformações de dados. É a escolha ideal para validação de APIs, formulários e configurações.
Prisma: o ORM que sente o TypeScript
\n\nTrabalhar com bancos de dados em TypeScript por muito tempo foi um compromisso. TypeORM era pesado, Sequelize era lento e Knex não era suficientemente tipado. O Prisma mudou as regras do jogo.
\n\nComo o Prisma funciona?
\n\nEm vez de escrever modelos no código, você descreve o esquema de dados em um arquivo especial schema.prisma. O Prisma gera um cliente TypeScript com suporte total a tipos.
// schema.prisma\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n posts Post[]\n createdAt DateTime @default(now())\n}\n\nmodel Post {\n id Int @id @default(autoincrement())\n title String\n content String?\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId Int\n}\n\n// Uso no código\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\n// Consultas totalmente tipadas\nasync function getUsersWithPosts() {\n const users = await prisma.user.findMany({\n include: {\n posts: {\n where: { published: true },\n select: { title: true, createdAt: true },\n },\n },\n orderBy: { createdAt: 'desc' },\n });\n\n // users — array com tipos corretos\n users.forEach(user => {\n console.log(user.email, user.posts.length);\n });\n}\n\nO Prisma automaticamente