typeScript (6): namespaces

Sí, también podemos manejar namespaces en js ^^

Stanley Boxer

archivado en: JavaScript / 13 Septiembre, 2016 / taller:

Los namespaces son otra de las características habituales de los lenguajes de programación que podemos tener en javaScript gracias a typeScript. Se parecen mucho a los módulos -de hecho, hasta la versión 1.5 de ts se conocían como «módulos internos» y cumplen una función similar: agrupar y encapsular partes del código con la misma funcionalidad. Por ejemplo, si estuviéramos preparando una calculadora, podríamos agrupar todas las operaciones en un mismo namespace.

namespace Calculadora {

interface Operaciones {

primerNumero: number;

segundoNumero: number;

mostrarResultado():number;

}

function compruebaNumero(numero) {

if ( isNaN(numero) ) {

return false;

}

return true;

}

class Sumar implements Operaciones {

primerNumero: number;

segundoNumero: number;

constructor(a:number, b:number) {

this.primerNumero = a;

this.segundoNumero = b;

}

mostrarResultado() {

if ( compruebaNumero(this.primerNumero) && compruebaNumero(this.segundoNumero) ) {

return this.primerNumero + this.segundoNumero;

}

return 0;

}

}

// otras operaciones...

}

Al igual que sucede con los módulos normales, para que esté disponible desde fuera algo dentro del namespace hay que exportarlo ex profeso. En la calculadora, por ejemplo, no nos interesa que el método comprobarNumero() sea público, ya que es una operación interna que no debería ser accesible desde fuera (recordemos la ley de Deméter). Por lo tanto, vamos a añadirle un export solo a las operaciones.

...

export class Sumar implements Operaciones {

...

Ahora ya sí podemos acceder a la clase Sumar anteponiendo su namespace.

let suma = new Calculadora.Sumar(3, 4);

suma.mostrarResultado();

Divide y vencerás

La mayor diferencia de los namespaces respecto a los módulos es que en el primer caso no necesitamos que las cosas estén agrupadas en el mismo sitio. Por ejemplo, mil líneas más abajo del anterior snippet podríamos haber definido la resta:

...

namespace Calculadora {

export class Restar implements Operaciones {

...

}

}

Lo único que debemos tener en cuenta es que, aunque algo esté incluido en el mismo namespace, si no se encuentra dentro del mismo par de llaves no puede acceder a lo que no está exportado. Por ejemplo, en este caso solo se puede invocar desde fuera del primer par de llaves el método accesible:

namespace Foo {

function inaccesible(): void{};

export function accesible(): void {};

}

namespace Foo {

class Bazinga {

bar() {

/* Esto funciona */

accesible();

/* Esto casca */

inaccesible();

}

}

}

Lo interesante de esto es que de esta manera podemos separar clases relacionadas en distintos archivos, tal y como se hace en php y otros lenguajes de programación, lo cual es mucho más elegante y ordenado. Pero para que esto funcione, debemos añadir un comentario antes de la declaración del namespace, en el cual indicamos la ruta (path) donde se encuentra el namespace principal. (En realidad no es un comentario, sino lo que denominan triple-slash directives, pero es un matiz que para esta introducción nos da igual). En el ejemplo anterior, si nos llevamos el segundo namespace a un archivo llamado foo.ts y dejamos el primero en otro denominado app.ts, deberíamos indicar en el segundo algo así:

/// <reference path="app.ts" />

namespace Foo {

class Bazinga {

bar() {

accesible();

}

}

}

|| Tags: ,

Este artículo aún no ha sido valorado.

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

Aportar un comentario

*