Germán Küber

Microsoft Architect

TypeScript 1.4 (Nuevas características) 1 – 2

Union types

Una funcionalidad muy potente, aunque a mi gusto puede ser considerada un anti patrón. La posibilidad de asignar distintos tipos a una variable, nos da flexibilidad a la hora de recibir parámetros, pero por otro lado nos hace perder un poco del poder de typescript. La razón es que al tener variables o parámetros, que pueden recibir distintos tipos, estamos abiertos a la posibilidad de una gran cantidad de errores. Aunque si decidimos utilizarlo sera necesario que utilicemos Type Guards.

var opts: string[]|string| (() => string);
opts = 'String entero'; // OK
opts = ['Primero', 'Segundo']; // OK
opts = () => "Devuelve"; // OK
opts = 1; //Error no se definio el tipo number

En esta ejemplo a nuestra variable “opts” podemos asignarle, un string, un array de string, o una funciona que retorne un string.

Type Guards

El gran poder del engine de TypeScript, queda demostrado en esta nueva característica.
Al hacer una comprobación de tipo, typescript, es capaz de inferir con que tipo estamos trabajando dentro de esa sección de código, y nos provee de los métodos correspondiente, haciendo inaccesible los métodos correspondientes al otro tipo.

function formatCommandline(c: string|string[]) {
    if (typeof c === 'string') {
        return c.trim();
    }
    else {
        return c.join(' ');
    }
}

Otro ejemplo que podemos dar, es mediante la utlización del operador instanceof

class Dog { woof() { } }
class Cat { meow() { } }
var pet: Dog|Cat ;
if (pet instanceof Dog) {
    pet.woof(); // OK
}
else {
    pet.woof(); // Error
}

 

Stricter Generics

Sin lugar a duda una de mis características favoritas. Los generics, son una de las características mas potentes que tenemos a la hora de realizar nuestros diseños. A través de ellos seremos capaces de reutilizar mucho código sin perder el tipado.

function equal<T>(lhs: T, rhs: T): boolean {
  return lhs === rhs;
}
var e = equal(42, 'hello'); //Se produce un error

En este caso vamos a tener un error, ya que al tener un único genérico el tipo de este se infiere a partir del primer parámetro, en este caso “number”, por lo que espera un segundo parametro del mismo tipo “number”.

class Usuario {
    //Creamos una clase del tipo Usuario
    public nombre: string;
}

class GenericRepository<T>{ 
    //Declaramos un repositorio generico que implementa Generic
    public getAll(): Array<T> {   }
}

class UsuarioRepository extends GenericRepository<Usuario> {
    //Extendemos el repositorio generico y le pasamos el tipo usuario

}

var usuarioRepository = new UsuarioRepository();

//Retorna un array de Usuarios
var usuarios = usuarioRepository.getAll();

Para ejemplificar el uso de generics, realizamos la implementación del conocido patrón Repository.

Better Type Inference

Una mejora considerable en la inferencia de tipos, para el uso de tuplas.

var tupla = [1, 'hello']; // x: Array<string|number>
tupla[0] = 'hola'; // OK
tupla[0] = false; // Error, Boolean no es ni string ni number

 

Translate »