Front End Tools </>

Uso de interfaces en typescript

Fecha publicación
Table of Contents

Una de las grandes utilidades de TypeScript es la definición de tipos estáticos. Las interfaces son una de esas herramientas nos brinda el lenguaje para la definición de tipos personalizados.

Definición de interfaces

Para declarar una interfaz en typescript, utilizar la palabra clave interface seguida del nombre.

interface NombreInterfaz {
  // Definición de propiedades
}

Dentro de llaves, se definen las propiedades de la interfaz.

interface Person {
  name: string
  surname: string
  secondSurname?: string
  age?: number
}

Propiedades opcionales

Para especificar que una propiedad de la interfaz es opcional, usar el signo de interrogación ? al final del nombre de la propiedad. Todas las demás son obligatorias.

Tipado de variables usando interfaces

Ya creada la interfaz podemos usarla para tipar las variables. Ya sea en otras interfaces, en variables, clases o funciones.

Para añadir tipos en typescript se añade : después del nombre de la variable.

const nombre: Person = {
  name: 'Geordano',
  surname: 'Polanco',
}

Está variable es de tipo Person, cualquier otro valor será marcado como error por el compilador de typescript.

Tipando funciones en una interfaz

Podemos añadir tipos a las funciones de una interfaz, para garantizar que cualquier función definida dentro de una interfaz será usada con la firma adecuada.

// Usando arrow function - expresion
interface PersonFullName {
    (person; Person) => string
}
// o bien por declaración
interface PersonFullName {
    (person: Person): string
}

Podemos tipar variables de tipo PersonFullName con una función que reciba una variable de tipo Person y devuelva un string.

const getFullName: PersonFullName = (person: Person) => {
  return `${person.name} ${person.surname}`
}

Si el valor de retorno o el parámetro que recibe la función es distinto al tipado de la interfaz, el compilador marcará el error.

Extender interfaces en typescript

En la programación orientada a objetos, es posible extender interfaces para componer otras interfaces más complejas.

Por ejemplo, tengo una interfase Base, que contiene las propiedades comunes de varias entidades.

interface Base {
  id: number
}

Extendemos la interfaz Person utilizando la interfaz Base.

interface Person extends Base {
  name: string
  surname: string
  secondSurname?: string
  age?: number
}

Además de extender otras interfaces, podemos extender una interfaz con una clase.

Implementar una interface en typescript

Al igual que la mayoría de los lenguajes de programación con tipado fuerte, en typescript podemos implementar interfaces en las clases.

Para implementar una interfaz, utilizamos la palabra reservada implements

class Person implements Base {
  id: number
  name: string
  surname: string
  secondSurname?: string
  age?: number

  getFullName(): string {
    return `${this.name} ${this.surname} ${this.secondSurname}`
  }
}

Al implementar una interfaz en una clase, typeScript obliga a añadir todas las sus propiedades.

Interfaces genéricas

En ocaciones para ir más allá en la reutilización de interfaces, podemos utilizar interfaces genéricas. Esto nos permite recibir uno o varios tipos de datos que serán utilizados en el interior de la interfaz.

interface GenericInterface<T> {
  // Definición de propiedades
} // T es un tipo genérico

Imagina una interfaz que contiene una función que retorna una lista de tipo T.

interface GenericList<T> {
  getList(): T[]
}

De esta forma podemos añadir una lógica en la función getList que siempre retorne una lista con el tipo genérico que definimos en la interfaz.

Hay muchas formas de sacar partido a esta gran fucnonalidad.

Conclusión

Las interface son de gran ayuda en timpo de desarrollo, nos ayudan a restringir el tipo de datos que asignamos a una variable. Sí, es más trabajo, pero nos ayuda a evitar errores en el desarrollo.

Referencia