Curso de GraphQL con Node.js

Tipos escalares de GraphQL y validación automática

Curso de GraphQL con Node.js

Contenido del curso

Tipos escalares de GraphQL y validación automática

Resumen

GraphQL tiene un sistema de tipos llamado scalar types que define qué información puedes enviar y recibir en tus queries. Aprender a usar Int, Float, String, Boolean e ID te permite construir APIs con validación automática de datos, tanto en la entrada como en la salida, sin escribir lógica adicional.

¿Qué son los scalar types en GraphQL?

Los scalar types son los tipos de datos primitivos que GraphQL soporta de forma nativa para tipar tus queries y resolvers. Son la base sobre la que después construyes tipos más complejos.

En la práctica, GraphQL te ofrece cinco tipos escalares y cada uno cumple un propósito puntual dentro de tu schema [01:00]:

  • Int: representa números enteros sin decimales.
  • Float: maneja números con precisión decimal, ideal para precios o medidas.
  • String: cadenas de texto, el tipo más común para nombres y descripciones.
  • Boolean: valores de verdadero o falso.
  • ID: identificador único; internamente se trata como string, pero su intención es representar claves únicas que incluso pueden usarse para sistemas de caché.

Un detalle de sintaxis importante: todos los tipos escalares se escriben con la primera letra en mayúscula, excepto ID, que va completamente en mayúsculas [01:30].

¿Para qué sirve el tipo ID en GraphQL? Es un string especial que representa un identificador único. Aunque se comporta como texto, su semántica le indica al cliente que ese valor sirve para identificar un recurso y puede aprovecharse en caché.

¿Cómo defines queries y resolvers con tipos escalares?

Dentro de tu variable typeDefinitions declaras la firma de cada query y luego, en la capa de resolvers, escribes la función que devuelve el valor con el tipo correcto.

Por ejemplo, así se ve una query que retorna cada uno de los tipos escalares:

graphql type Query { getInt: Int getFloat: Float getString: String getBoolean: Boolean getID: ID }

Y los resolvers correspondientes devuelven el valor que prometiste en el contrato:

javascript const resolvers = { Query: { getInt: () => 10, getFloat: () => 12.5, getString: () => "Hola", getBoolean: () => true, getID: () => "abc123" } }

Una vez los tienes listos, puedes ejecutar varias queries en paralelo dentro del playground y GraphQL las resuelve a todas en una sola petición [04:30]. Esa flexibilidad es uno de los grandes diferenciadores frente a REST.

¿Cómo tipar argumentos de entrada en una query?

Los tipos escalares no solo describen lo que retornas, también validan lo que recibes. Puedes definir argumentos en tus queries indicando su tipo:

graphql type Query { getInt(age: Int): Int getFloat(price: Float): Float }

En el resolver, esos argumentos llegan en el segundo parámetro, que normalmente se nombra args:

javascript getInt: (parent, args) => args.age, getFloat: (parent, args) => args.price

De esa forma, el mismo typing funciona en doble vía: como contrato de salida y como contrato de entrada.

¿Cómo valida GraphQL la integridad de los datos?

GraphQL aplica los contratos de tipos en ambas direcciones. Si tu resolver promete un String pero retorna un array, el servidor responde con un error indicando que la información de salida es incorrecta [06:00].

Lo interesante pasa también en la entrada. Si la query espera un Int y el cliente manda un string, GraphQL bloquea la consulta antes de ejecutarla:

  • Envías age: 12 y price: 12.5 y todo funciona.
  • Envías age: "12" como texto y la consulta falla automáticamente.

Esto significa que una aplicación en React, Angular o móvil no puede enviar un tipo distinto al definido en el schema. La validación es automática y sucede del lado del servidor sin que tú escribas código extra.

¿GraphQL valida los datos automáticamente? Sí. Valida tanto el valor que retorna el resolver como los argumentos que envía el cliente. Si alguno no cumple el tipo declarado, la query falla antes de ejecutarse.

¿Qué pasa si mi resolver retorna un tipo distinto al declarado? GraphQL responde con un error de tipo y no entrega la información al cliente. El contrato del schema obliga al backend a cumplir la firma exacta.

Esa doble validación es lo que convierte a GraphQL en una capa confiable entre clientes y servidores: el schema funciona como un acuerdo estricto que ambas partes deben respetar. En la siguiente clase verás cómo extender estos tipos con listas y cómo marcar campos para que nunca retornen valores en nulo. ¿Cuál de estos tipos escalares usas más en tus proyectos? Cuéntalo en los comentarios.