<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=II._Angular_4_Openwebinars</id>
	<title>II. Angular 4 Openwebinars - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=II._Angular_4_Openwebinars"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=II._Angular_4_Openwebinars&amp;action=history"/>
	<updated>2026-08-30T05:40:41Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=II._Angular_4_Openwebinars&amp;diff=258308&amp;oldid=prev</id>
		<title>Joan: /* Typescript part IV */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=II._Angular_4_Openwebinars&amp;diff=258308&amp;oldid=prev"/>
		<updated>2019-03-21T17:08:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Typescript part IV&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=Typescript part I=&lt;br /&gt;
==¿Por qué usar typescript?==&lt;br /&gt;
Aunque sea un lenguaje nuevo (y eso implica tener que aprenderlo) es muy fácil entenderlo porque:&lt;br /&gt;
&lt;br /&gt;
*Soporta todas las características de Ecmascript 2015&lt;br /&gt;
*Encaja muy bien con la filosofía de Angular (de detectar fallos en compilación)&lt;br /&gt;
*Nos permite usar anotaciones (también llamados decoradores) para configurar un componente.&lt;br /&gt;
*Es un subconjunto de Ecmascript 2015 (ES6) con dos diferencias grandes: tipos y anotaciones.&lt;br /&gt;
&lt;br /&gt;
==Características de ES2016==&lt;br /&gt;
===Template literals===&lt;br /&gt;
*Multilínea&lt;br /&gt;
*Interpolación con sintaxis '''${variable}'''&lt;br /&gt;
**Se evalúa cuando se define la cadena, no de forma dinámica como angular&lt;br /&gt;
*Permiten parseo de cada parte de la cadena, tagged template literals&lt;br /&gt;
===let/const===&lt;br /&gt;
*Reemplazo a var para declarar variables&lt;br /&gt;
*Scope restringido al bloque &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      for (var i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
          // algo&lt;br /&gt;
      }&lt;br /&gt;
      console.log(i) // 10!&lt;br /&gt;
&lt;br /&gt;
      for (let j = 0; j &amp;lt; 10; j++) {&lt;br /&gt;
          // algo&lt;br /&gt;
      }&lt;br /&gt;
      console.log(j) // j is not defined&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Sin hoisting, no podemos usar una variable antes de definirla&lt;br /&gt;
*Binding en cada iteración, nos permite crear funciones en bucles que utilicen variables dentro del for.&lt;br /&gt;
===Arrow functions===&lt;br /&gt;
*Funciones expresadas de forma compactas &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  increment = function(x) {&lt;br /&gt;
        return x+1&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  increment = x =&amp;gt; x+1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Con retorno implícito si sólo tienen 1 expresión (no hace falta el return ni las llaves)&lt;br /&gt;
*No hace faltan los paréntesis en los parámetros si sólo tienen 1 (sino () =&amp;gt; 1 o (a,b)=&amp;gt;a+b)&lt;br /&gt;
*No bindean this, por lo que es más fácil definir event handlers en el DOM.&lt;br /&gt;
===for ... of===&lt;br /&gt;
*Iteración mejorada (no recorre propiedades padre como for in)&lt;br /&gt;
*Funciona con todos los iterables (como strings)&lt;br /&gt;
*Combinable con destructuring&lt;br /&gt;
===Sintaxis corta de objetos===&lt;br /&gt;
Forma breve de definir objetos que usar como nombre de la variable el nombre de la propiedad.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    let name = 'nhpatt';&lt;br /&gt;
    obj = {name: name} // antigua forma&lt;br /&gt;
    obj = {name} // nueva forma&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Rest y spread===&lt;br /&gt;
Operadores (diferentes!) con la misma sintaxis: ... (3 puntos seguidos)&lt;br /&gt;
&lt;br /&gt;
Spread sirve para extraer valores de un array o un objeto:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    log(...[1, 2, 3]); // uso de spread operator&lt;br /&gt;
&lt;br /&gt;
    function log(a, b, c) {&lt;br /&gt;
        console.log(`first value is ${a}, second is ${b} and third ${c}`)&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Rest'' para la operación inversa, de elementos a array:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    log(1, 2, 3); // uso de rest operator&lt;br /&gt;
&lt;br /&gt;
    function log(... array) {&lt;br /&gt;
        console.log(array) // array [1, 2, 3]&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Valores por defecto===&lt;br /&gt;
En parámetros de una función&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    function ejemplo(valor = 1) {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Typescript part II=&lt;br /&gt;
==Destructuring==&lt;br /&gt;
Descomponer arrays y objetos a variables&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let arr = [0, 1, 2];&lt;br /&gt;
&lt;br /&gt;
let [a, b, c] = arr;&lt;br /&gt;
&lt;br /&gt;
console.log(a, b, c) // 0, 1, 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Se puede combinar con valores por defecto y operador rest.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let arr = [0, 1, 2];&lt;br /&gt;
&lt;br /&gt;
let [a, ...b] = arr;&lt;br /&gt;
&lt;br /&gt;
console.log(a, b) // 0, [1, 2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
let [a, b, c, d = 3] = arr;&lt;br /&gt;
&lt;br /&gt;
console.log(a, b, c, d) // 0, 1, 2, 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
También podemos usarlo para invertir variables&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let a = 0;&lt;br /&gt;
let b = 1;&lt;br /&gt;
&lt;br /&gt;
[b, a] = [a, b];&lt;br /&gt;
&lt;br /&gt;
console.log(a, b) // 1, 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
O para transformar parámetros de entrada de funciones&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let arr = [0, 1];&lt;br /&gt;
&lt;br /&gt;
log(arr);&lt;br /&gt;
&lt;br /&gt;
function log([a, b]) {&lt;br /&gt;
    console.log(a, b)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Más características de ES2015/ES6==&lt;br /&gt;
*Soporte para Maps &amp;amp; Sets&lt;br /&gt;
*Soporte nativo de promesas&lt;br /&gt;
*Async/await&lt;br /&gt;
*Módulos&lt;br /&gt;
==Clases==&lt;br /&gt;
Azúcar sintáctico sobre la herencia prototípica con soporte de:&lt;br /&gt;
*Herencia (extends)&lt;br /&gt;
*Constructores (constructor() {})&lt;br /&gt;
*Métodos de instancia (metodo() {})&lt;br /&gt;
*Métodos estáticos (static metodo() {})&lt;br /&gt;
*Overrides de métodos a hijos (super.metodo())&lt;br /&gt;
*Llamadas a constructores padre (super())&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class AppComponent {&lt;br /&gt;
&lt;br /&gt;
 atributo;&lt;br /&gt;
&lt;br /&gt;
 metodo() {&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 constructor() { }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Typescript part III=&lt;br /&gt;
==Diferencias de Typescript==&lt;br /&gt;
*Tipos&lt;br /&gt;
*Interfaces&lt;br /&gt;
*Visibilidad&lt;br /&gt;
*Decoradores&lt;br /&gt;
*Sólo 1 constructor&lt;br /&gt;
*Constructores breves&lt;br /&gt;
==Tipos==&lt;br /&gt;
Els tuipus són:&lt;br /&gt;
*boolean, number, string, arrays, enum (enumerados), Any (cualquiera), Void (ninguno), Object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let cadena: string;&lt;br /&gt;
cadena = 'Hola';&lt;br /&gt;
cadena = 2: // ERROR!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Con tipado gradual. Podemos no escribir un tipo y el compilador intentará inferirlo y hacer comprobaciones en tiempo compilación.&lt;br /&gt;
*Tipo any para saltarse las comprobaciones de tipos.&lt;br /&gt;
*La sintaxis en arrays es&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let array1: Array&amp;lt;number&amp;gt;;&lt;br /&gt;
let array2: number[];&lt;br /&gt;
==Interfaces==&lt;br /&gt;
No generan código en producción, sólo son comprobaciones en tiempo de ejecución&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
interface Talk {&lt;br /&gt;
    name: String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let charla = {name: 'Rx'}; //implementación implícita&lt;br /&gt;
&lt;br /&gt;
class MyTalk implements Talk {&lt;br /&gt;
    name = 'Rx';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let charla2 = new MyTalk(); //implementación explícita&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Visibilidad==&lt;br /&gt;
Public por defecto.&lt;br /&gt;
==Constructores breves==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
constructor(public name = 'Rx') {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Equivale a definir un atributo y fijar su valor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
name;&lt;br /&gt;
&lt;br /&gt;
constructor(name = 'Rx') {&lt;br /&gt;
 this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Operador Elvis (NO es de Typescript, es sintaxis de templates de Angular)==&lt;br /&gt;
Previene errores al recorrer un objeto con valores nulos&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{objeto?.propiedad?.valor}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Typescript part IV=&lt;br /&gt;
*Tipos unión ''North'' | ''East'';&lt;br /&gt;
*Tipos función en interfaces&lt;br /&gt;
*Generics y constraints&lt;br /&gt;
*Mixins y merging&lt;br /&gt;
==Novedades en Typescript 2.1, 2.2 y 2.3==&lt;br /&gt;
*Object Spread y Rest&lt;br /&gt;
*Iteradores asíncronos&lt;br /&gt;
*Mejoras en mixins&lt;br /&gt;
*Tipo Object&lt;br /&gt;
*new.target&lt;br /&gt;
*Valores por defecto en genéricos&lt;br /&gt;
*-strict flag&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, març 2019&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>