DEV Community

Cristian Fernando
Cristian Fernando

Posted on • Edited on

Fundamentos de TypeScript 🦆| #13: Interfaces

Las interfaces probablemente sean la característica que más verás en proyectos desarrollados con TypeScript.

¿Qué es una interfaz?

En palabras poco técnicas una interfaz es como una especie de molde para nuestro datos. No debemos confundir el término con la UI de una app, en este caso el concepto de interfaz se relaciona más con la estructura de los datos de nuestro software. Por ejemplo:

interface Persona {
  id:number;
  nombre: string;
  apellido: string;
  edad: number;
  esSoltero: boolean;
}

interface Perro {
  id:number | string;
  nombre: string;
  color: string[];
  raza:string;
  sexo: "Macho" | "Hembra"
}

interface Vehiculo {
  placa:string;
  color: string;
  ruedas: number;
  puertas: number;
  marca: string;
  esNuevo: boolean;
}
Enter fullscreen mode Exit fullscreen mode

En este caso, tenemos 3 interfaces: Persona, Perro, Vehiculo. Cada una de ellas se declara con la palabra reservada interface seguido del nombre de la interfaz (en Pascal Case) y entre llaves todas las propiedades con sus tipos de datos separadas por ;.

Interfaz como tipo de dato

Las interfaces se usan como tipos de datos personalizables, con los ejemplos anteriores podríamos crear objetos de la siguiente manera:

interface Persona {
  id:number;
  nombre: string;
  apellido: string;
  edad: number;
  esSoltero: boolean;
}

const pedro:Persona = {
  id:1,
  nombre:"Pedro",
  apellido:"Sanchez",
  edad:36,
  esSoltero:true,
}
Enter fullscreen mode Exit fullscreen mode

Nuestra variable pedro es de tipo Persona, por ende debe tener OBLIGATORIAMENTE todas las variables declaradas en Persona.

El contrato de una Interfaz

En el ejemplo anterior se dice que pedro cumple el contrato de Persona puesto que tiene todos los datos declarados de manera correcta: id, nombre, apellido, edad, esSoltero. Si faltara un dato podríamos decir que pedro no cumple con el contrato de Persona puesto que mínimamente debería incluir todos los datos de la interfaz.

Propiedades opcionales

Las interfaces al igual que las funciones soportan valores opcionales con el operador ?

interface Vehiculo {
  placa:string;
  color: string;
  ruedas?: number;
  puertas?: number;
  marca: string;
  esNuevo: boolean;
}

const hilux:Vehiculo = {
  placa: 'HYK-256',
  color: 'rojo',
  marca: 'Toyota',
  esNuevo: true,
}
Enter fullscreen mode Exit fullscreen mode

La variable hilux es de tipo Vehiculo pero tanto ruedas como puertas son propiedades opcionales, por ello al crear el objeto y no incluir esos valores no tenemos ningún error.

Propiedades de solo lectura

Con la palabra reservada readonly podemos especificar las propiedades que solo son de lectura y que no podremos cambiar:

interface Perro {
  id:number | string;
  readonly nombre: string;
  color: string[];
  raza:string;
  sexo: "Macho" | "Hembra"
}

// nombre es de solo lectura

const boby:Perro = {
  id: "125-boby",
  nombre:"Boby",
  color: ["cafe","blanco"],
  raza:"cooker",
  sexo: "Macho"
}

boby.raza = "pastor aleman";
console.log(boby)
boby.nombre = "Rufo"
Enter fullscreen mode Exit fullscreen mode

Si intentamos cambiar la raza del objeto boby no hay problema, pero si hacemos lo mismo con nombre nos dará un error:
Cannot assign to 'nombre' because it is a read-only property.

Herencia de interfaces

Usando la palabra extends podemos heredar interfaces:

interface Vehiculo {
  placa:string;
  color: string;
  ruedas?: number;
  puertas?: number;
  marca: string;
  esNuevo: boolean;
}

interface Bicicleta extends Vehiculo {
  esMontañera: boolean;
  traccion: number;
}

const miBici:Bicicleta = {
  placa: '123-abc',
  color: 'negro',
  marca: 'Santusa',
  esNuevo: true,
  esMontañera:true,
  traccion: 21,
}
Enter fullscreen mode Exit fullscreen mode

La interfaz Bicicleta hereda todas las propiedades de Vehiculo, por tanto, el objeto miBici debe tener tanto los atributos de Bicicleta como los de Vehiculo.

Para este ejemplo podemos hacer opcionales las propiedades ruedas y puertas ya que para la interfaz Bicicleta no tiene mucho sentido.

Conclusiones

  • Las interfaces son una forma de estructurar los datos de nuestro software creando tipos de datos específicos.
  • Puedes usar parámetros opcionales con ?
  • Las interfaces soportan herencia con extends
  • Con readonly podemos hacer propiedades de solo lectura.

Referencias

Top comments (0)