= introducción a TypeScript y ECMAScript 6 (ES6) * uso intensivo en aplicaciones Angular * decoradores = característica experimental en ES6, pero consolidados en Angular * JavaScript tiene tipado débil de tipos, lo que no nos avisa de situaciones que pueden producir errores. == TypeScript * {{ :development:angular:typescript.pdf |}} * [[https://www.typescriptlang.org/]] * superconjunto de ECMAScript 6 (lo dota de mayores funcionalidades, destacando el tipoado de datos) * ficheros **.ts**, no ejecutables directamente, necesita ser compilado * por defecto al compilar se genera código ECMAScript 5 * definición de los tipos en los parámetros de las funciones == instalación * npm install -g typescript == compilación * compilar (tsc = TypeScript Console): ''tsc '' * compilar automaticamente el fichero ante cambios: ''tsc -w'' * compilar automaticamente todos los ficheros ante cambios: tsc --init # genera fichero tsconfig.json tsc -w # generará el fichero .js correspondiente para cada .ts * este fichero **tsconfig.json** además: * versión ES que debe generarse * nivel exigencia de los warnings * compilación incremental o no * directorios de origen y destino * si se permiten características experimentales (aka decoradores) === ejemplo var alumno = { nombre: "Joan" } function saludar(nombre) { console.log("Hola " + nombre); } saludar(alumno); * ''node app.js'' -> Hola [Object object] var alumno = { nombre: "Joan" } function saludar(nombre:string) { console.log("Hola " + nombre); } saludar(alumno); == tipos * se declaran los tipos, aunque pueden ser inferidos por el valor * number, string, boolean * vector (array) * del mismo tipo * let myArray: numbers[] = [15,16]; * let myArray: Array = [15,16]; * tupla: * diferentes tipos * let tupla: [string, number, boolean] = ["Juan", 8, true]; * enum * enum Vehiculo { Coche, Camion, Bus } * let miVehiculo: Vehiculo = Vehiculo.camion; console.log(miVehiculo) // 1 let otroVehiculo: string = Vehiculo[1]; console.log(otroVehiculo) // Camion * any: * let cantidad: any = 1; # pierde el sentido usar typescript! * void * valor vacío * function miFuncion(): void { console.log(Math.PI * 3); } * null * undefined * never * object * type assertions: * conversiones a convenio y responsabilidad del programador * aka **casting** * let miVariable: any = "Soy una cadena"; let unValor: string MiVariable; let unValor: string = miVariable as string; === clases * definición de clases * por defecto visibilidad pública, permite **public**, **private**, **protected** * class Greeter { constructor(private greeting: string) { } greet() { return "Hello, " + this.greeting; } } * al usar **private**, sabe que **greeting** es un atributo de la clase * extends: creación de subclases a partir de otra * implements: * implementa un **interface**: * declaración sin código ni valores * creación de nuevos tipos * abstract: clase abstracta no instanciable * super: hacer referencia a la superclase desde una subclase === interfaces * se declarar indicando las propiedades y métodos que contendran * sin valores ni métodos:interface Sumergible { tiempoMaxBajoElAgua: number; profundidadMaxima: number; ascender(): void; } * interface Producto { readonly nombre: string; // solo lectura precio?: number; // optional stock: number; } let miProd: Producto; miProd = { nombre: "Reloj XYZ", stock: 50 } console.log(miProd.nombre + ": " + miProd.stock + " unidades"); miProd.nombre = "Gafas sol ABC"; console.log(miProd.nombre); * como nuevo tipo:interface CitaCalendario { fechaHora: Date; titulo: string; lugar: string; } let cita1: CitaCalendario; * readonly: solo permite una sola asignación * ? : valor opcional