← Back to home

Typescript: Tipo vs Interfaz

Cover Image for Typescript: Tipo vs Interfaz
3 min readLevel:

¿Cuáles son las diferencias entre los tipos y las interfaces? Aunque pueden parecer similares existen diferencias bastante específicas teniendo en cuenta el potencial que tienen. En la mayoría de casos, no tiene sentido preocuparse por dichas diferencias.

Antes de continuar, tienes que saber qué es TypeScript y qué implica usarlo. Puedes encontrar más información en este post.

Pongámonos manos a la obra...

Una de las principales cracterísticas adicionales que proporciona TypeScript es la definición de tipos personalizados. En TypeScript podemos definir formas (shapes) usando la palabra clave type o interface.

¿Por qué interface es una opción?

Desde el estándar ECMAScript 2015, JavaScript nos permite usar y definir clases.

Históricamente, las clases y las interfaces forman una estrecha relación ya que con una interfaz puedes describir el modelo de una clase. Probablemente hayas leído alguna vez algo como "una clase implementa una interfaz". Básicamente, esto es lo que justifica la existencia de interfaces en TypeScript.

Entonces, en pocas palabras, una interfaz (interface) se usa para describir la forma de un dato de manera estructural de la misma manera que lo hace un tipo (type), salvando algunas diferencias sutiles.

Trabajando con el ejemplo

Imagina que tenemos estas dos definiciones:

type Person = {
    name: string,
    id: string,
    age: number,
}

interface Student {
    name: string;
    id: string;
    age: number;
}

Las interfaces y los tipos parecen ser completamente lo mismo. ¿Dónde están las diferencias? La mayor diferencia es la fusión de declaraciones (declaration merging).

La fusión de declaraciones para interfaces permite declarar una interfaz varias veces en el mismo archivo. TypeScript combinará y fusionará internamente en una sola interfaz todas las propiedades declaradas.

Como podemos ver en el ejemplo anterior, podemos fusionar declaraciones y combinar las propiedades y TypeScript generará un error cada vez que no se satisfaga la seguridad de tipos (type safety). La combinación de declaraciones no se puede utilizar con tipos (types):

¿Por qué alguien declararía las mismas interfaces varias veces en el mismo archivo? Nadie en su sano juicio haría algo así, ¿no?

Hay un caso de uso especial en el que la fusión de declaraciones tiene mucho sentido. En este post profundizaremos en este tema.

Pero, aún así, en última instancia, ¿qué opción es la mejor?

Algunos abogan que es preferible el uso de interfaces. Si prefieres profundizar más en detalle puedes encontrar más información en este post de Nicholas Jamieson.

Otros abogan que es preferible el uso de types por simplicidad ya que hay pocas situaciones en las que necesitemos de la fusión de declaraciones.

Mi opinión es que debemos usar aquello con lo que nos sintamos más cómodos siempre que hagamos un uso adecuado. Las diferencias son mínimas por lo que el uso de uno u otro vendrá limitado estrícticamente por las limitaciones descritas en este post.

If you find any kind of error, something that it's not clear enough or you want me to drill down in more detail, don't hesitate to contact me.