Creando un objeto según la interfaz de TypeScript: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo crear un objeto basado en una interfaz en TypeScript: explicación completa con código

\n\n

¿Alguna vez te has encontrado en una situación en la que TypeScript literalmente te «grita» porque intentas crear un objeto que no coincide con la interfaz? ¿Te suena familiar? Si trabajas con TypeScript aunque sea una semana, seguro que has visto este error:

\n\n
Type '{}' is missing the following properties from type 'User': name, age
\n\n

Este es uno de los problemas más populares en Stack Overflow (decenas de miles de visitas), y hoy lo resolveremos de una vez por todas. En este artículo aprenderás cómo crear un objeto basado en una interfaz en TypeScript, cuáles son las formas y cuándo usar cada una.

\n\n

¿Por qué es tan importante este tema?

\n\n

TypeScript es una extensión de JavaScript que añade tipado estático. Las interfaces de TypeScript son una herramienta poderosa para describir la estructura de los objetos. Pero los principiantes a menudo se confunden: «Declaré una interfaz, ¿cómo creo ahora un objeto real?»

\n\n

Sin una comprensión correcta de este mecanismo, perderás horas depurando o, peor aún, usarás any, lo que es un camino directo a perder todas las ventajas de TypeScript.

\n\n

Forma 1: Asignación directa (la más sencilla)

\n\n

La forma más obvia de crear un objeto según la interfaz de TypeScript es simplemente asignar un literal de objeto a una variable con el tipo de la interfaz:

\n\n
interface User {\n  name: string;\n  age: number;\n  email?: string; // campo opcional\n}\n\n// ✅ Correcto: el objeto coincide completamente con la interfaz\nconst user: User = {\n  name: "Ana",\n  age: 28,\n  email: "ana@example.com"\n};\n\n// ✅ También correcto: el campo opcional se puede omitir\nconst userMinimal: User = {\n  name: "Iván",\n  age: 35\n};
\n\n

Esto funciona, pero hay un detalle: TypeScript verificará que el objeto tenga TODOS los campos obligatorios. Si olvidas name o age, el compilador mostrará un error.

\n\n

❌ Error típico de principiantes

\n\n
// ❌ ¡Error! Falta el campo obligatorio 'age'\nconst badUser: User = {\n  name: "Pedro"\n};
\n\n

Forma 2: Uso del operador as (conversión de tipo)

\n\n

A veces necesitas crear un objeto gradualmente, por ejemplo, llenándolo desde diferentes fuentes. En estos casos, puedes usar el operador as:

\n\n
interface Config {\n  apiUrl: string;\n  timeout: number;\n  retries: number;\n}\n\n// Creamos un objeto vacío con conversión de tipo\nconst config = {} as Config;\n\n// Ahora podemos agregar campos uno por uno\nconfig.apiUrl = "https://api.example.com";\nconfig.timeout = 5000;\nconfig.retries = 3;\n\n// ✅ Funciona, pero TEN CUIDADO
\n\n

⚠️ Advertencia: Esta forma desactiva la verificación de tipos en el momento de la creación del objeto. Podrías omitir accidentalmente un campo obligatorio y descubrirlo solo en tiempo de ejecución. Usa as solo cuando estés seguro de que todos los campos se llenarán.

\n\n

Forma 3: Función fábrica (recomendada)

\n\n

La mejor manera de crear un objeto basado en una interfaz en TypeScript es escribir una función fábrica. Esto proporciona un 100% de seguridad de tipos y la posibilidad de establecer valores predeterminados:

\n\n
interface Product {\n  id: number;\n  title: string;\n  price: number;\n  inStock: boolean;\n  description?: string;\n}\n\n// Función fábrica con parámetros predeterminados\nfunction createProduct(\n  id: number,\n  title: string,\n  price: number,\n  inStock: boolean = true,\n  description?: string\n): Product {\n  return {\n    id,\n    title,\n    price,\n    inStock,\n    ...(description && { description })\n  };\n}\n\n// Uso\nconst laptop = createProduct(1, "Portátil", 999.99);\nconst phone = createProduct(2, "Teléfono inteligente", 599.99, false, "Excelente teléfono");\n\nconsole.log(laptop); // { id: 1, title: 'Portátil', price: 999.99, inStock: true }\nconsole.log(phone)                

Blogs

Book Recommendations