Salta al contingut principal

Cuaderno de software: Un vistazo a TypeScript

Durante este fin de semana (y parte de la semana) he podido jugar con la KataTennis en TypeScript Un lenguaje creado por Anders Hejlsberg creador de Pascal, Delphi y C#.


Así que aprovechando el código de la Katatennis, veamos que nos trae TypeScript.


Características Básicas de TypeScript


Tipado En Diseño


TypeScript es un lenguaje que añade a JavaScript una capa de tipado estático y algunas otras incorporaciones de OOP tradicional. Esta capa puede resultarnos de muchísima ayuda durante el desarrollo. Sin embargo todas estas características son simplemente para ayudar a trabajar con JavaScript en tiempo de diseño, ya que TypeScript compila todo como JavaScript tradicional, veamos un ejemplo:









DoScoring(currentScore: number, otherPlayerScore: number, message : ScoringMessage): ScoringRuleResult


En el código anterior hemos indicado el tipo de cada uno de los parámetros a TypeScript y tipo que tendrá resultado de la función. Esto permite al compilador de TypeScript avisarnos en caso de pasar un tipo incorrecto. También, dado que TypeScript entiende los parámetros de una función como obligatorios, nos ayuda cuando omitimos por error alguno de los parámetros.


Lo mismo es posible cuando definimos un parámetro de función, TypeScript permite que definamos su forma utilizando una sintaxis muy parecida a la utilizada en C# para las expresiones lambda:









DoSomething(whatToDo : (s : string) => bool);


Por supuesto, el tipado es elección del desarrollador, en todo momento podemos no especificar el tipo de una variable o parámetro o utilizar la plabra clave any. De la misma forma, podemos marcar un parámetro en una función como opcional, tan sólo especificando ? después del nombre.


Clases y Herencia tradicional


TypeScript implementa clases y herencia basados en la OOP tradicional. Esto permite crear clases como:









class Match {
private alreadyWinner = false;

constructor (public player1: Player, public player2: Player, public scoreboard: Scoreboard) {
if (!player1) throw "Player1 Is Required";
if (!player2) throw "Player2 Is Required";
}

class TennisMatch extends Match {
constructor (player1, player2) {
super(player1, player2, new TennisScoreboard());
}
}


Match es una clase tradicional en la que hemos definido un constructor con 3 parámetros. También tiene una variable privada, que como todo en TypeScript sólo es privada durante el tiempo de diseño, ya que JavaScript no tiene dicha accesibilidad.


Podemos aplicar herencia utilizando extends, TypeScript nos obligará a llamar al constructor de la clase padre mediante super, y nos ayudará en los parámetros necesarios. Realmente sencillo.


Interfaces y Tipado Estructural


JavaScript no permite definir el tipo concreto de un parámetro en una función. Sin embargo, esta característica nos permite pasar cualquier parámetro que cumpla estructuralmente con el tipo que esperamos.


TypeScript respeta el Tipado Estructural, a la vez que nos ayuda en tiempo diseño con el primer punto.









private ScoringOnAdvantageWins(currentScore: number, otherPlayerScore: number, message : ScoringMessage): ScoringRuleResult {
var result = false;

if (result = (currentScore == Scoreboard.advantage)) {
currentScore = Scoreboard.win;
message.message = "wins";
}

return { currentScore: currentScore, otherPlayerScore: otherPlayerScore, satisfied: result };
}


Aqui utilizando la notación de objetos de JavaScript, creamos un objeto ScoringRuleResult. TypeScript nos ayuda a inicializar cada uno de los miembros con información sobre su nombre y tipo, gracias a que previamente hemos definido la interfaz de ScoringRuleResult:









interface ScoringRuleResult {
currentScore: number;
otherPlayerScore: number;
satisfied: bool;
};


Referenciando otras librerías


Realizar una Kata sin TDD no sería lo mismo. En JavaScript existen muy buenas y extendidas librerías para hacer TDD, aunque mi favorita es Jasmine.


Aunque en TypeScript podemos incluir código JavaScript sin modificaciones, cuando la complejidad del código es muy grande, podemos encontrarnos con errores. Al menos en esta versión 0.8.0.0 de TypeScript Jasmine no podía incluirse como una referencia dentro de un fichero de TypeScript.


Así que TypeScript dispone de un método con el que hacer referencia a librerías de JavaScript sin que afecte a la compilación y, sobre todo, con información sobre el tipo y forma de la API a utilizar. TypeScript incluye archivos de definición para JQuery, WinJS o el DOM de HTML, sin embargo todavía no hay uno para Jasmine. Así que siguiendo la documentación podemos crear la definición de una API como Jasmine que luego podremos referenciar en nuestros archivos de TypeScript:









declare function describe(suiteName : string, suite : () =>; void);
declare function xdescribe(suiteName : string, suite : () =>; void);

declare function it(expectation: string, assertion: () =>; void );
declare function xit(expectation: string, assertion: () =>; void );

declare function beforeEach(action: () =>; void );
declare function afterEach(action: () =>; void );

interface JasmineMatchers {
not: JasmineMatchers;
toBe(match: any);
toEqual(match: any);
toMatch(match: string);
toBeDefined();
toBeUndefined();
toBeNull();
toBeTruthy();
toBeFalsy();
toContain(match : any);
toBeLessThan(match: number);
toBeGreaterThan(match: number);
toBeCloseTo(expected: number, tolerance: number);
}

declare function expect(actual: any): JasmineMatchers;


Intellisense With Jasmine


Depurando: SourceMapping


Podemos depurar TypeScript mediante el JavaScript generado por el compilador, o podemos utilizar la técnica SourceMapping. Sourcemapping esta soportado en las últimas versiones de desarrollo de Chrome y Webkit, y nos permite depurar en el navegador el código compilado en JavaScript, pero viendo TypeScript.


El compilador de TypeScript soporta generar archivos SourceMap mediante el parámetro –sourceMap:









tsc --sourcemap hello.ts


También podemos modificar la siguiente línea añadiendo el parámetro –sourcemap en nuestro fichero de proyecto de Visual Studio y disfrutar de SourceMapping automático para todo el proyecto:









Name="BeforeBuild">
Command=""$(PROGRAMFILES)\Microsoft SDKs\TypeScript\0.8.0.0\tsc" -sourcemap @(TypeScriptCompile -> '"%(fullpath)"', ' ')" />
>



Una vez activado el SourceMapping en Chrome, podemos depurar nuestro código TypeScript directamente en el navegador:

Depurando en Chrome una spec de Jasmine


Valoración


TypeScript se añade a la ya sobrecargada lista de lenguajes que compilan a JavaScript, una moda que en estos momentos ha alcanzado toda su fuerza. Sin embargo, la aproximación de Anders me ha gustado. La idea de describir en diseño cuál es la información de tipo pero permitiendo ser dinámicos cuando se necesita.


Aún así hay que advertir, que no es recomendable programar en TypeScript sin antes conocer la programación en JavaScript, dado que sin conocerlo nos podríamos encontrar con situaciones extrañas durante el desarrollo, a las que sólo podemos encontrar sentido si conocemos como funciona JavaScript.


Teniendo en cuenta que TypeScript esta en su versión 0.8.0.0 le queda un largo camino por recorrer, para convertirse en un lenguaje maduro, pero sin duda es un buen comienzo.


Enlaces


Specificación en TypeScript de Jasmine

Solución a la KataTennis en Solveet









via Planeta Código http://www.programania.net/diseno-de-software/un-vistazo-a-typescript/

Comentaris

Entrades populars d'aquest blog

15 Tutoriales CSS3 para mejorar tus paginas web

15 Tutoriales CSS3 para mejorar tus paginas web : Les dejo una pequeña recopilación de tutoriales CSS3 que espero sean de utilidad para ustedes, intentamos hacer una recopilación bastante completa para crear impresionantes diseños web con CSS3 y aprovechar las bondades de CSS3 incluso para aplicar efectos, son un total de 15 tutoriales CSS3 gratis . Crear menu dropdown con CSS3 Crear breadcrumbs con estilo Transiciones de paginas con CSS3 Crear timeline con CSS3 y jQuery Reproductor de video con HTML5, CSS3 y jQuery Crear efecto acordion CSS3 Aplicar degradado a texto Crear texto en curva con CSS3 y jQuery Aplicar textura a texto con Magic Pill Crear slider de imagenes con CSS3 y jQuery Rotar texto con CSS3 Crear menu vertical con CSS3 Crear formulario con HTML5 y CSS3 Crear efecto de imagenes apiladas con CSS3 Aplicar estilos para imagenes con CSS3  

Averiguar la Salud del Disco Duro, con Crystal Disk Info [Windows]

Averiguar la Salud del Disco Duro, con Crystal Disk Info [Windows] : El actual “cuello de botella” en nuestras PCs; es decir, donde todo el rendimiento de nuestra PC llega a estancarse , es en el Disco Duro. Si bien los procesadores han evolucionado considerablemente en velocidad / rendimiento, el RAM no sólo es más económico, sino más veloz, y las tarjetas de video siguen innovando con cada generación, los discos duros han permanecido idénticos desde hace años, limitados por la física. Y es que un disco duro tradicional sólo tiene un máximo de velocidad con el que puede girar (medido en revoluciones por minuto, o RPM) que, a su vez, limita la velocidad de lectura y escritura. En pocas palabras, a pesar de que nuestras PCs pueden procesar información mucho más rápido que hace 5 años, los discos duros siguen leyendo (y escribiendo) esta información prácticamente a la misma velocidad. Esto ha cambiado con la llegada de los SSD, los Discos de Estado Sólo que no están limitados por la velo...

Learn Composition from the Photography of Henri Cartier-Bresson

“Do you see it?” This question is a photographic mantra. Myron Barnstone , my mentor, repeats this question every day with the hopes that we do “see it.” This obvious question reminds me that even though I have seen Cartier-Bresson’s prints and read his books, there are major parts of his work which remain hidden from public view. Beneath the surface of perfectly timed snap shots is a design sensibility that is rarely challenged by contemporary photographers. Henri Cartier-Bresson. © Martine Franck Words To Know 1:1.5 Ratio: The 35mm negative measures 36mm x 24mm. Mathematically it can be reduced to a 3:2 ratio. Reduced even further it will be referred to as the 1:1.5 Ratio or the 1.5 Rectangle. Eyes: The frame of an image is created by two vertical lines and two horizontal lines. The intersection of these lines is called an eye. The four corners of a negative can be called the “eyes.” This is extremely important because the diagonals connecting these lines will form the breakdown ...