Biblioteca GraphQL para TypeScript: un enfoque moderno para las API
GraphQL es un lenguaje de consultas para API que permite a los clientes solicitar solo los datos necesarios. En combinación con TypeScript, proporciona un potente sistema de tipos que garantiza seguridad y autocompletado. En pythonlib.ru, analizaremos la biblioteca clave para trabajar con GraphQL en TypeScript — type-graphql, así como alternativas.
¿Por qué TypeScript + GraphQL?
TypeScript agrega tipado estático, lo cual es fundamental para proyectos grandes. El esquema de GraphQL, descrito a través de clases de TypeScript, se convierte en una única fuente de verdad: los cambios en el código se sincronizan automáticamente con la API. Esto elimina las discrepancias entre la documentación y el comportamiento real del servidor.
Biblioteca principal: TypeGraphQL
type-graphql es un framework para crear API GraphQL en TypeScript utilizando decoradores. Sigue el principio code-first: usted define el esquema a través del código, no mediante SDL (Schema Definition Language).
Instalación
npm install type-graphql graphql reflect-metadataAgregue en tsconfig.json:
{ "emitDecoratorMetadata": true, "experimentalDecorators": true}Ejemplo: definición de tipo y resolver
Creemos un modelo de usuario simple y un resolver para obtener datos.
import { ObjectType, Field, ID, Resolver, Query } from "type-graphql";
@ObjectType()class User { @Field(() => ID) id: number;
@Field() name: string;
@Field({ nullable: true }) email?: string;}
@Resolver()class UserResolver { @Query(() => [User]) users(): User[] { return [ { id: 1, name: "Ana", email: "anna@example.com" }, { id: 2, name: "Boris", email: null } ]; }}Compilación e inicio del servidor
import { buildSchema } from "type-graphql";import { ApolloServer } from "@apollo/server";import { startStandaloneServer } from "@apollo/server/standalone";
async function main() { const schema = await buildSchema({ resolvers: [UserResolver] });
const server = new ApolloServer({ schema }); const { url } = await startStandaloneServer(server, { listen: { port: 4000 } }); console.log(`Servidor iniciado: ${url}`);}
main();Bibliotecas alternativas
- NestJS + GraphQL — integración con el popular framework. Utiliza
@nestjs/graphqlbasado entype-graphql. - GraphQL Nexus — biblioteca code-first sin decoradores, utiliza cadenas de métodos.
- Pothos GraphQL — biblioteca code-first moderna con excelente soporte para TypeScript.
Funcionalidades avanzadas de TypeGraphQL
Argumentos y mutaciones
import { Arg, Mutation } from "type-graphql";
@Resolver()class UserResolver { @Mutation(() => User) createUser(@Arg("name") name: string, @Arg("email") email: string): User { return { id: 3, name, email }; }}Validación con class-validator
import { Length, IsEmail } from "class-validator";import { InputType, Field } from "type-graphql";
@InputType()class CreateUserInput { @Field() @Length(2, 30) name: string;
@Field() @IsEmail() email: string;}Autorización mediante middleware
import { UseMiddleware } from "type-graphql";
function AuthMiddleware(): MiddlewareFn { return async ({ context }, next) => { if (!context.user) throw new Error("No autorizado"); return next(); };}
@Resolver()class UserResolver { @Query(() => User) @UseMiddleware(AuthMiddleware) me(): User { return { id: 1, name: "Usuario actual", email: "user@example.com" }; }}