SlideShare a Scribd company logo
1 of 69
Download to read offline
Except where otherwise noted, this work is licensed under:
http://creativecommons.org/licenses/by-nc-sa/3.0/
TypeScript para
Javeros
Cómo programar web
front-end y sentirse
como en casa
Leganés, 11 y 12 de
febrero
Micael Gallego
¿Quién soy?
developer
¿Quién soy?
developer
¿Quién soy?
developer
Características
● Imperativo
● Funcional (expresiones lambda)
● Recolector de basura
● Tipos estáticos
● Orientado a objetos (con clases)
● Modularidad con paquetes
Funcional
expresiones lambda
Java 8
streams
Orientado a objetos
Tipado estático
Errores en tiempo de compilación
Tipado estático
Autocompletar
Tipado estático
Refactorizaciones automatizadas
Tipado estático
Documentación integrada en el IDE
¿Web front-end?
ES5
Características
● Imperativo
● Funcional
● Recolector de basura
● Tipos dinámicos
● Orientado a objetos (con prototipos)
● Sin modularidad
ES5
Tipos dinámicos
● El compilador no te ayuda
● Hay que ejecutar los tests (si tienes)
● El IDE tampoco te ayuda
● No se puede refactorizar de forma automática
● El autocompletar es muy limitado
● La documentación integrada sólo aparece en
casos muy evidentes
● No se puede navegar a la implementación
ES5
Orientado a objetos
con prototipos
● Existen 3 formas diferentes de implementar
“clases”
● Prototipos “a mano”
● Simulación de clases con librerías
● Patrón módulo usando clousures
● Los patrones de diseño OO no se pueden
aplicar directamente
ES5
Sin modularidad
● Para independizar código tienes que usar
patrones basados en funciones
ES5
(function() {
var variableTemporal = "a";
//Otro código…
}());
Immediately-Invoked Function Expression (IIFE)
¿Java en front-end?
Características
● Framework de desarrollo de aplicaciones web
AJAX / SPA
● El back-end y front-end se desarrollan en Java
● En sus primeras versiones tenía muchos
inconvenientes
● Pesado. Mucho tiempo de compilación
● Sistema de componentes propio (no bootstrap)
● Protocolo de comunicación propio
Características
● La versión 2.8 ha mejorado mucho
● JsInterop: Permite integrar fácilmente código Java y
JavaScript
● Se soporta Java 8 (expresiones lambda)
package com.acme;
@JsType
class Foo {
public int x;
public int y;
public int sum() {
return x + y;
}
}
Java
var foo = new com.acme.Foo();
foo.x = 40;
foo.y = 2;
foo.sum(); JS
Características
● No lo considero una tecnología de front-end
genérica
● Lo usaría solo para portar código Java existente a
front-end con poco coste
https://news.ycombinator.com/item?id=8554339
¿Tipos estáticos y
POO con clases
en front-end?
Características
● Añade tipos estáticos a JavaScript ES6
● Inferencia de tipos
● Tipos opcionales
● El compilador genera código JavaScript ES5
(compatible con los navegadores web actuales)
● Orientado a Objetos con clases (no como ES5)
● Anotaciones (ES7)
http://www.typescriptlang.org/
Características
● Mejoras debidas a JavaScript ES6 (ES2015)
● Orientación a Objetos con clases
● Arrow functions con captura de this
● Let
● Estructuras de datos
● Módulos
● Mejoras debidas a JavaScript ES7
● Anotaciones
● Async / await
Ventajas frente a JavaScript
● Con el tipado estático el compilador puede verificar
la corrección de muchas más cosas que con el
tipado dinámico
● Los programas grandes son menos propensos a
errores
● Los IDEs y editores pueden: Autocompletar,
Refactorizar, Navegar a la definición
● Muy parecido a Java y C#
Facilidad de adopción para JavaScripters
● Los tipos son opcionales
● La inferencia de tipos permite no tener que
escribir los tipos constantemente
● En realidad es JavaScript con más cosas, así que
todo lo conocido se puede aplicar
● Un mismo proyecto puede combinar JS yTS, lo
que facilita migrar un proyecto existente
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
TypeScript
Orientación a Objetos
TypeScript vs JavaScript ES5
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
function Empleado(nombre, salario){
this.nombre = nombre;
this.salario = salario;
}
Empleado.prototype.getNombre = function(){
return nombre;
};
Empleado.prototype.toString = function(){
return "Nombre:"+this.nombre+",
Salario:"+this.salario;
};
Simulación de clase en JS ES5 con prototipos
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
public class Empleado {
private String nombre;
private double salario;
public Empleado(String nombre,
double salario){
this.nombre = nombre;
this.salario = salario;
}
public String getNombre(){
return nombre;
}
public String toString(){
return "Nombre:"+nombre+
", Salario:"+salario;
}
}
Clase en Java
export class Empleado {
private nombre:string;
private salario:number;
constructor(nombre:string,
salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
Clase enTypeScript
Orientación a Objetos
TypeScript vs Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
En Java las clases de la misma carpeta se pueden usar sin importar.
EnTypeScript se tienen que importar porque cada fichero es un módulo distinto
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
En Java usamos List y ArrayList del SDK.
EnTypeScript usamos el Array nativo de JavaScript
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
En Java List el método es “add”
EnTypeScript Array el método es “push”
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
Módulos /Variables / for / lambda
List<Empleado> emps = new ArrayList<>();
emps.add(new Empleado('Pepe', 500));
emps.add(new Empleado('Juan', 200));
for(Empleado emp : emps){
System.out.println(emp.getNombre());
}
empleados.forEach(emp -> {
System.out.println(emp);
});
Java
import { Empleado } from "./Empleado";
let emps = new Array<Empleado>();
emps.push(new Empleado('Pepe', 500));
emps.push(new Empleado('Juan', 200));
for(let emp of emps){
console.log(emp.getNombre());
}
empleados.forEach(emp => {
console.log(emp);
});
TypeScript
Módulos /Variables / for / lambda
Ventajas respecto a Java
Características que gustarán a los
desarrolladores Java porque simplifica
patrones comunes
interface SquareConfig {
color: string;
width?: number;
}
Ventajas respecto a Java
Objetos literales con verificación y sintaxis compacta
function createSquare(config: SquareConfig){
...
}
createSquare({color: "black"});
createSquare({color: "black", width: 20});
interface SquareConfig {
color: string;
width?: number;
}
Ventajas respecto a Java
Objetos literales con verificación y sintaxis compacta
function createSquare(config: SquareConfig){
...
}
createSquare({color: "black"});
createSquare({color: "black", width: 20});
class Animal {
private name:string;
constructor(name: string) {
this.name = name;
}
}
Ventajas respecto a Java
Sintaxis compacta de definición de “beans”
class Animal {
constructor(private name: string) {
}
}
class Animal {
private name:string;
constructor(name: string) {
this.name = name;
}
}
Ventajas respecto a Java
Sintaxis compacta de definición de “beans”
class Animal {
constructor(private name: string) {
}
}
class Animal { eat() { } }
class Dog extends Animal { woof() { } }
class Cat extends Animal { meow() { } }
var pet: Animal = undefined;
if (pet instanceof Dog) {
pet.woof();
} else if (pet instanceof Cat) {
pet.meow();
} else {
pet.eat();
}
Ventajas respecto a Java
Type guards Instanceof / typeof
class Animal { eat() { } }
class Dog extends Animal { woof() { } }
class Cat extends Animal { meow() { } }
var pet: Animal = undefined;
if (pet instanceof Dog) {
pet.woof();
} else if (pet instanceof Cat) {
pet.meow();
} else {
pet.eat();
}
Ventajas respecto a Java
Type guards Instanceof / typeof
Limitaciones respecto a Java
Cosas que los javeros echarán de menos
Limitaciones respecto a Java
● El código se ejecuta en una JavaScriptVM, se
aplican todas las limitaciones del mismo
● No hay números de 64 bits (ni long ni double)
● No hay concurrencia con memoria
compartida
● El control del recolector de basura no permite
implementar weak / soft references
Programación asíncrona
Simulación de sincronía con async / await
http://www.sitepoint.com/javascript-goes-asynchronous-awesome/
http://www.sitepoint.com/javascript-goes-asynchronous-awesome/
Editores / IDEs
Hay plugins para la mayoría de los editores / IDEs
SublimeText Visual Studio
Code
WebStorm
Editores / IDEs
Hay plugins para la mayoría de los editores / IDEs
SublimeText Visual Studio
Code
WebStorm
59
WebStorm 11
60
WebStorm 11
61
WebStorm 11
62
Atom / atom-typescript
https://atom.io/packages/atom-typescript
¿TypeScript se usa?
TypeScript
coffeescript
ES6
Angular 2
TypeScript es el lenguaje recomendado
Angular 2 recomienda
usarTypeScript
import {Component} from 'angular2/core';
@Component({
selector: 'app',
templateUrl: 'app.html'
})
export class AppComponent {
name = 'Anybody';
}
app.component.ts
<h1>Hello {{name}}!</h1>
app.html
Otros frameworks
soportan el uso deTypeScript
Incluso los editores online
TypeScript se puede transpilar a ES5
directamente en el propio browser
System.config({
  transpiler: 'typescript',
  typescriptOptions: {
    emitDecoratorMetadata: true
  },
  map: {
    app: "./src"
  },
  packages: {
    app: {
      main: './main.ts',
      defaultExtension: 'ts'
    }
  }
});
¿Preguntas?
Gracias...

More Related Content

Viewers also liked

Viewers also liked (15)

WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015
 
Desarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e IonicDesarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e Ionic
 
GRASP con PR para el SRFLP en el MAEB 2016
GRASP con PR para el SRFLP en el MAEB 2016GRASP con PR para el SRFLP en el MAEB 2016
GRASP con PR para el SRFLP en el MAEB 2016
 
Tema 1: ¿Qué es la web? (Desarrollo Aplicaciones Web)
Tema 1: ¿Qué es la web? (Desarrollo Aplicaciones Web)Tema 1: ¿Qué es la web? (Desarrollo Aplicaciones Web)
Tema 1: ¿Qué es la web? (Desarrollo Aplicaciones Web)
 
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browserTypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
 
La priorización de historias de usuario (versión ampliada)
La priorización de historias de usuario (versión ampliada)La priorización de historias de usuario (versión ampliada)
La priorización de historias de usuario (versión ampliada)
 
El mundo real en el aula, con la ayuda del profesor
El mundo real en el aula, con la ayuda del profesorEl mundo real en el aula, con la ayuda del profesor
El mundo real en el aula, con la ayuda del profesor
 
La priorización de historias de usuario (versión reducida)
La priorización de historias de usuario (versión reducida)La priorización de historias de usuario (versión reducida)
La priorización de historias de usuario (versión reducida)
 
Docker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJCDocker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJC
 
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
JavaScript para Javeros. ¿Cómo ser moderno y no morir en el intento?
 
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
 
Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016
 
Using Docker to build and test in your laptop and Jenkins
Using Docker to build and test in your laptop and JenkinsUsing Docker to build and test in your laptop and Jenkins
Using Docker to build and test in your laptop and Jenkins
 
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
 

Similar to TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa

JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptx
FamiliaAyluardo
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
El Jota
 

Similar to TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa (20)

JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptx
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 
Programacion orientada a objetos 2
Programacion orientada a objetos 2Programacion orientada a objetos 2
Programacion orientada a objetos 2
 
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
 
Programacion orientada a objetos en javascript
Programacion orientada a objetos en javascriptProgramacion orientada a objetos en javascript
Programacion orientada a objetos en javascript
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
Java
JavaJava
Java
 
Programación Orientada a Objetos - Unidad 2: clases y objetos
Programación Orientada a Objetos - Unidad 2: clases y objetosProgramación Orientada a Objetos - Unidad 2: clases y objetos
Programación Orientada a Objetos - Unidad 2: clases y objetos
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
 
Javascript C#
Javascript C#Javascript C#
Javascript C#
 
Curso Swift
Curso SwiftCurso Swift
Curso Swift
 
Javascript - 2014
Javascript - 2014Javascript - 2014
Javascript - 2014
 
2 f programas
2 f programas2 f programas
2 f programas
 
2 f programas
2 f programas2 f programas
2 f programas
 
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
 

More from Micael Gallego

More from Micael Gallego (19)

Software libre para videoconferencias
Software libre para videoconferenciasSoftware libre para videoconferencias
Software libre para videoconferencias
 
La evaluación con realimentación y posibilidad de recuperación para evitar el...
La evaluación con realimentación y posibilidad de recuperación para evitar el...La evaluación con realimentación y posibilidad de recuperación para evitar el...
La evaluación con realimentación y posibilidad de recuperación para evitar el...
 
WebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduWebRTC en tu web con OpenVidu
WebRTC en tu web con OpenVidu
 
¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?
 
Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020
 
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
 
Testing cloud and kubernetes applications - ElasTest
Testing cloud and kubernetes applications - ElasTestTesting cloud and kubernetes applications - ElasTest
Testing cloud and kubernetes applications - ElasTest
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJC
 
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosTesteando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018
 
Introducción a las Pruebas Software
Introducción a las Pruebas SoftwareIntroducción a las Pruebas Software
Introducción a las Pruebas Software
 
Node para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigoNode para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigo
 
Testing fácil con Docker: Gestiona dependencias y unifica entornos
Testing fácil con Docker: Gestiona dependencias y unifica entornosTesting fácil con Docker: Gestiona dependencias y unifica entornos
Testing fácil con Docker: Gestiona dependencias y unifica entornos
 
Desarrollo centrado en tareas en Eclipse con Mylyn 2009
Desarrollo centrado en tareas en Eclipse con Mylyn 2009Desarrollo centrado en tareas en Eclipse con Mylyn 2009
Desarrollo centrado en tareas en Eclipse con Mylyn 2009
 
Como ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicacionesComo ser mas productivo en el desarrollo de aplicaciones
Como ser mas productivo en el desarrollo de aplicaciones
 
TypeScript: Un lenguaje aburrido para programadores torpes y tristes
TypeScript: Un lenguaje aburrido para programadores torpes y tristesTypeScript: Un lenguaje aburrido para programadores torpes y tristes
TypeScript: Un lenguaje aburrido para programadores torpes y tristes
 
El Aprendizaje Basado en Proyectos y la Clase Invertida para acercar el mundo...
El Aprendizaje Basado en Proyectos y la Clase Invertida para acercar el mundo...El Aprendizaje Basado en Proyectos y la Clase Invertida para acercar el mundo...
El Aprendizaje Basado en Proyectos y la Clase Invertida para acercar el mundo...
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Recently uploaded (11)

pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 

TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa

  • 1. Except where otherwise noted, this work is licensed under: http://creativecommons.org/licenses/by-nc-sa/3.0/ TypeScript para Javeros Cómo programar web front-end y sentirse como en casa Leganés, 11 y 12 de febrero Micael Gallego
  • 5.
  • 6. Características ● Imperativo ● Funcional (expresiones lambda) ● Recolector de basura ● Tipos estáticos ● Orientado a objetos (con clases) ● Modularidad con paquetes
  • 9. Tipado estático Errores en tiempo de compilación
  • 13.
  • 15. ES5
  • 16. Características ● Imperativo ● Funcional ● Recolector de basura ● Tipos dinámicos ● Orientado a objetos (con prototipos) ● Sin modularidad ES5
  • 17. Tipos dinámicos ● El compilador no te ayuda ● Hay que ejecutar los tests (si tienes) ● El IDE tampoco te ayuda ● No se puede refactorizar de forma automática ● El autocompletar es muy limitado ● La documentación integrada sólo aparece en casos muy evidentes ● No se puede navegar a la implementación ES5
  • 18. Orientado a objetos con prototipos ● Existen 3 formas diferentes de implementar “clases” ● Prototipos “a mano” ● Simulación de clases con librerías ● Patrón módulo usando clousures ● Los patrones de diseño OO no se pueden aplicar directamente ES5
  • 19. Sin modularidad ● Para independizar código tienes que usar patrones basados en funciones ES5 (function() { var variableTemporal = "a"; //Otro código… }()); Immediately-Invoked Function Expression (IIFE)
  • 21.
  • 22. Características ● Framework de desarrollo de aplicaciones web AJAX / SPA ● El back-end y front-end se desarrollan en Java ● En sus primeras versiones tenía muchos inconvenientes ● Pesado. Mucho tiempo de compilación ● Sistema de componentes propio (no bootstrap) ● Protocolo de comunicación propio
  • 23. Características ● La versión 2.8 ha mejorado mucho ● JsInterop: Permite integrar fácilmente código Java y JavaScript ● Se soporta Java 8 (expresiones lambda) package com.acme; @JsType class Foo { public int x; public int y; public int sum() { return x + y; } } Java var foo = new com.acme.Foo(); foo.x = 40; foo.y = 2; foo.sum(); JS
  • 24. Características ● No lo considero una tecnología de front-end genérica ● Lo usaría solo para portar código Java existente a front-end con poco coste https://news.ycombinator.com/item?id=8554339
  • 25. ¿Tipos estáticos y POO con clases en front-end?
  • 26.
  • 27. Características ● Añade tipos estáticos a JavaScript ES6 ● Inferencia de tipos ● Tipos opcionales ● El compilador genera código JavaScript ES5 (compatible con los navegadores web actuales) ● Orientado a Objetos con clases (no como ES5) ● Anotaciones (ES7) http://www.typescriptlang.org/
  • 28. Características ● Mejoras debidas a JavaScript ES6 (ES2015) ● Orientación a Objetos con clases ● Arrow functions con captura de this ● Let ● Estructuras de datos ● Módulos ● Mejoras debidas a JavaScript ES7 ● Anotaciones ● Async / await
  • 29. Ventajas frente a JavaScript ● Con el tipado estático el compilador puede verificar la corrección de muchas más cosas que con el tipado dinámico ● Los programas grandes son menos propensos a errores ● Los IDEs y editores pueden: Autocompletar, Refactorizar, Navegar a la definición ● Muy parecido a Java y C#
  • 30. Facilidad de adopción para JavaScripters ● Los tipos son opcionales ● La inferencia de tipos permite no tener que escribir los tipos constantemente ● En realidad es JavaScript con más cosas, así que todo lo conocido se puede aplicar ● Un mismo proyecto puede combinar JS yTS, lo que facilita migrar un proyecto existente
  • 31. export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } TypeScript
  • 32. Orientación a Objetos TypeScript vs JavaScript ES5 export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript function Empleado(nombre, salario){ this.nombre = nombre; this.salario = salario; } Empleado.prototype.getNombre = function(){ return nombre; }; Empleado.prototype.toString = function(){ return "Nombre:"+this.nombre+", Salario:"+this.salario; }; Simulación de clase en JS ES5 con prototipos
  • 33. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 34. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 35. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 36. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 37. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 38. public class Empleado { private String nombre; private double salario; public Empleado(String nombre, double salario){ this.nombre = nombre; this.salario = salario; } public String getNombre(){ return nombre; } public String toString(){ return "Nombre:"+nombre+ ", Salario:"+salario; } } Clase en Java export class Empleado { private nombre:string; private salario:number; constructor(nombre:string, salario:number){ this.nombre = nombre; this.salario = salario; } getNombre(){ return this.nombre; } toString(){ return "Nombre:"+this.nombre+ ", Salario:"+this.salario; } } Clase enTypeScript Orientación a Objetos TypeScript vs Java
  • 39. import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); Módulos /Variables / for / lambda
  • 40. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript Módulos /Variables / for / lambda
  • 41. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript En Java las clases de la misma carpeta se pueden usar sin importar. EnTypeScript se tienen que importar porque cada fichero es un módulo distinto Módulos /Variables / for / lambda
  • 42. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript En Java usamos List y ArrayList del SDK. EnTypeScript usamos el Array nativo de JavaScript Módulos /Variables / for / lambda
  • 43. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript En Java List el método es “add” EnTypeScript Array el método es “push” Módulos /Variables / for / lambda
  • 44. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript Módulos /Variables / for / lambda
  • 45. List<Empleado> emps = new ArrayList<>(); emps.add(new Empleado('Pepe', 500)); emps.add(new Empleado('Juan', 200)); for(Empleado emp : emps){ System.out.println(emp.getNombre()); } empleados.forEach(emp -> { System.out.println(emp); }); Java import { Empleado } from "./Empleado"; let emps = new Array<Empleado>(); emps.push(new Empleado('Pepe', 500)); emps.push(new Empleado('Juan', 200)); for(let emp of emps){ console.log(emp.getNombre()); } empleados.forEach(emp => { console.log(emp); }); TypeScript Módulos /Variables / for / lambda
  • 46. Ventajas respecto a Java Características que gustarán a los desarrolladores Java porque simplifica patrones comunes
  • 47. interface SquareConfig { color: string; width?: number; } Ventajas respecto a Java Objetos literales con verificación y sintaxis compacta function createSquare(config: SquareConfig){ ... } createSquare({color: "black"}); createSquare({color: "black", width: 20});
  • 48. interface SquareConfig { color: string; width?: number; } Ventajas respecto a Java Objetos literales con verificación y sintaxis compacta function createSquare(config: SquareConfig){ ... } createSquare({color: "black"}); createSquare({color: "black", width: 20});
  • 49. class Animal { private name:string; constructor(name: string) { this.name = name; } } Ventajas respecto a Java Sintaxis compacta de definición de “beans” class Animal { constructor(private name: string) { } }
  • 50. class Animal { private name:string; constructor(name: string) { this.name = name; } } Ventajas respecto a Java Sintaxis compacta de definición de “beans” class Animal { constructor(private name: string) { } }
  • 51. class Animal { eat() { } } class Dog extends Animal { woof() { } } class Cat extends Animal { meow() { } } var pet: Animal = undefined; if (pet instanceof Dog) { pet.woof(); } else if (pet instanceof Cat) { pet.meow(); } else { pet.eat(); } Ventajas respecto a Java Type guards Instanceof / typeof
  • 52. class Animal { eat() { } } class Dog extends Animal { woof() { } } class Cat extends Animal { meow() { } } var pet: Animal = undefined; if (pet instanceof Dog) { pet.woof(); } else if (pet instanceof Cat) { pet.meow(); } else { pet.eat(); } Ventajas respecto a Java Type guards Instanceof / typeof
  • 53. Limitaciones respecto a Java Cosas que los javeros echarán de menos
  • 54. Limitaciones respecto a Java ● El código se ejecuta en una JavaScriptVM, se aplican todas las limitaciones del mismo ● No hay números de 64 bits (ni long ni double) ● No hay concurrencia con memoria compartida ● El control del recolector de basura no permite implementar weak / soft references
  • 55. Programación asíncrona Simulación de sincronía con async / await http://www.sitepoint.com/javascript-goes-asynchronous-awesome/
  • 57. Editores / IDEs Hay plugins para la mayoría de los editores / IDEs SublimeText Visual Studio Code WebStorm
  • 58. Editores / IDEs Hay plugins para la mayoría de los editores / IDEs SublimeText Visual Studio Code WebStorm
  • 65. Angular 2 TypeScript es el lenguaje recomendado
  • 66. Angular 2 recomienda usarTypeScript import {Component} from 'angular2/core'; @Component({ selector: 'app', templateUrl: 'app.html' }) export class AppComponent { name = 'Anybody'; } app.component.ts <h1>Hello {{name}}!</h1> app.html
  • 67. Otros frameworks soportan el uso deTypeScript
  • 68. Incluso los editores online TypeScript se puede transpilar a ES5 directamente en el propio browser System.config({   transpiler: 'typescript',   typescriptOptions: {     emitDecoratorMetadata: true   },   map: {     app: "./src"   },   packages: {     app: {       main: './main.ts',       defaultExtension: 'ts'     }   } });