Interfaces de solo lectura en TypeScript

22/Sep/2017 Typescript Deja un comentario
Programación TypeScript

Mediante los interfaces de solo lectura en TypeScript podemos conseguir que las propiedades que estemos gestionando en una llamada a una función no puedan ser sobrescritas. De esta manera nos aseguramos que los valores que se pasan una vez creado el objeto son inmutables.

Para poder definir interfaces de solo lectura en TypeScript deberemos de seguir la siguiente estructura:

  1. interface nombreInterface {
  2. readonly propiedad: tipo-dato;
  3. }

Es decir, delante de la propiedad que queremos sea de solo lectura anteponemos la palabra readonly. Podemos definir una, varias o todas las propiedades de un interface como readonly.

Por ejemplo, podríamos definir nuestro interface Persona con propiedades de solo lectura de la siguiente forma:

  1. interface Persona {
  2. readonly nombre: string;
  3. readonly edad: number;
  4. }

En este caso ambas propiedades: nombre y edad han sido definidas como readonly.

Podemos definir una función que asuma el control de alguno de sus parámetros mediante el interface Persona.

  1. function datosPersona(p: Persona) {...}

Y podemos invocarla mediante un objeto que cumpla el interface.

  1. let p1 = {nombre:'Carlos', edad:42, localidad:'Zamora'}
  2. datosPersona(p1);

Lo que, bajo ningún concepto, no podremos hacer es modificar los atributos del objeto pasado a la función. Así, si escribimos el siguiente código, en el cual intentamos modificar la propiedad nombre dentro de la función:

  1. function datosPersona(p: Persona) {
  2. p.nombre = 'Víctor';
  3. console.log(p.nombre);
  4. }

Veremos que el compilador nos da un error e indica que no se puede modificar la propiedad al ser de solo lectura.

De esta manera ya sabes que cuando quieras tener información inmutable dentro de una función simplemente tienes que utilizar interfaces de solo lectura en TypeScript.

Vídeos sobre TypeScript


¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*