JSON a TypeScript

Pega una muestra de JSON y la herramienta infiere interfaces de TypeScript que coinciden con su forma. Los campos se tipifican por los valores observados (string, number, boolean, Array<T>), los objetos anidados obtienen sus propias interfaces nombradas, y los campos observados como nulos o faltantes se vuelven opcionales (?) o anulables (| null) dependiendo del estilo que prefieras.

Cómo convertir JSON a TypeScript

  1. 1

    Pega JSON

    Una sola muestra es suficiente; múltiples muestras mejoran la inferencia de nulabilidad y unión.

  2. 2

    Elige el estilo de salida

    `interface` (predeterminado), alias `type`, o interfaz de solo lectura con todos los campos marcados como `readonly`.

  3. 3

    Elige la estrategia opcional

    Marca los campos como `?` (pueden estar ausentes) o `| null` (siempre presentes, pueden ser nulos).

  4. 4

    Copia los tipos

    Pégalo en un archivo `.ts` y tendrás acceso fuertemente tipado a la respuesta de la API.

Ejemplo

Entrada:

{ "id": 1, "name": "Alice", "age": null, "tags": ["admin", "user"], "address": { "city": "Madrid" } }

Salida:

interface User {
  id: number;
  name: string;
  age: number | null;
  tags: string[];
  address: Address;
}

interface Address {
  city: string;
}

Mapeo de tipos

JSON TypeScript
cadena string
entero / decimal number
booleano boolean
solo null null
null + T T | null (o T?)
arreglo de T T[]
arreglo mixto (T1 | T2)[]
objeto Interfaz anidada nombrada
arreglo vacío unknown[] (no se puede inferir)

Opcional vs anulable

  • foo?: string, el campo puede estar ausente del objeto. Se aplica la verificación de undefined.
  • foo: string | null, el campo está siempre presente pero puede ser explícitamente nulo.
  • foo?: string | null, podría estar ausente O nulo.

JSON en sí no tiene undefined, pero las APIs varían en cómo señalan la ausencia. Alinea con la semántica de tu API:

  • Las APIs REST típicamente omiten campos faltantes -> ?:.
  • GraphQL siempre devuelve cada campo solicitado -> | null.
  • Algunos SDK utilizan ambos en diferentes contextos.

Tipos de unión vs literales

Si la herramienta ve el mismo campo de cadena con un pequeño conjunto de valores en las muestras ("status": "pending", "active", "archived"), puede emitir una unión de literales de cadena:

status: "pending" | "active" | "archived";

Activa “inferir uniones de literales de cadena” si deseas esto.

Errores comunes

  • Inferir de una sola muestra. Cada campo se vuelve requerido; no se puede observar la nulabilidad. Pasa de 5 a 10 muestras variadas para obtener mejores tipos.
  • Arreglos vacíos. "tags": [] no proporciona información de tipo, el generador emite unknown[]. Proporciona una muestra con al menos un elemento.
  • Arreglos de tipos mixtos. [1, "two", true] produce (number | string | boolean)[]. Generalmente esto significa que el JSON debería ser rediseñado en lugar de tipificado.
  • Claves de cadena numéricas. JSON {"1": "a", "2": "b"} sigue siendo un objeto en TypeScript (Record<string, string>), no un arreglo. El generador maneja esto correctamente.

Preguntas frecuentes

Alinea con tu API. Las APIs REST que eliminan campos nulos quieren ?:. GraphQL, que siempre devuelve cada campo seleccionado, quiere | null. Cuando tengas dudas, T | null con sintaxis requerida es más estricta y captura más errores en tiempo de compilación.

Sí, si lo habilitas y proporcionas múltiples muestras. Un campo observado con 2-5 valores de cadena distintos en las muestras se emite como una unión literal. Más allá de ese umbral, vuelve a string.

interface para la mayoría de los casos, es abierta a extensión y TypeScript la optimiza mejor. Los alias type son útiles para uniones, intersecciones, tuplas y tipos mapeados. Para tipos derivados de JSON, cualquiera funciona; elige una convención de proyecto.

Sí. Cada objeto anidado se convierte en su propia interfaz, con nombres derivados de la clave (user.address -> Address). Para estructuras muy profundas o repetitivas, considera un esquema JSON y un generador dedicado de esquema a TS.

Herramientas relacionadas

Herramienta disponible en otros idiomas