On Github bryanerayner / LearningTypescript
Created by Bryan E Rayner
Javascript, for all it's benefits, provides a considerable challenge for many developers.
There are many languages which compile to Javascript:
Today, we'll be focusing on Typescript.
Typescript is a language which compiles to well-written Javascript.
// Typescript
class Welcomer
{
  message:string = '';
  setMessage(newMessage:string) {
    this.message = newMessage;
  }
  sayMessage() {
    console.log(this.message);
  }
}
						
//Javascript
var Welcomer = (function () {
  function Welcomer() {
    this.message = '';
  }
  Welcomer.prototype.setMessage = function (newMessage) {
    this.message = newMessage;
  };
  Welcomer.prototype.sayMessage = function () {
    console.log(this.message);
  };
  return Welcomer;
})();
					All Javascript is valid Typescript
// Valid Typescript:
var hello = function(){
  return "Hey y'all!";
};
var object = {
  normal:'property',
  definitions:'you bet'
};
console.log(hello());
					Typescript compiles ES6 syntax to ES5, and ES3
  // Fat arrow functions:
  var boundLookup = (propName) => this[propName];
  // Splat operator
  var splattedFunction = function(one, two, ...rest){
      // rest is the rest of the arguments after two
  }
					Typescript optionally gives developers strong typing.
// Without types var foo = 'five'; foo = 5; // What if you don't catch this bug? // With types var bar: string = 'six'; bar = 6; // This will throw an error in the compiler.
Type systems help you help yourself
Type systems tell computers what the heck you're doing.
They help translate this:
var boxCounter = 5;
To this value in RAM:
00000101
As opposed to this ASCII value:
00110101
Here's Javascript and C++ in a quick comparison
    // Javascript:
    var counter;          // Allocate an arbitrary amount of RAM.
    counter = 5;          // Store a value of 5.
    counter = 'cinco';    // Store an array of 16-bit Unicode Characters.
    // C++:
    long counter;         // Allocate 64 bits of RAM.
    counter = 5;          // Store a value of 5
    counter = 'no bueno'; // This code won't even work
				
// Perfectly valid (and insane) Javascript:
  var object = {};
  var summary = 'The fruit bowl has ';
  object.value = function () {
    return summary + 'apple';
  }
  object['value'] = object.value() + "s and oranges.";
  object.value = (function() {
    return object.value + ' And bananas.';
  })();
  summary = (function() {console.log(object.value);})();
// Outputs: 'The fruit bowl has apples and oranges. And bananas.
					Interfaces tell IDE's (and Typescript) what to expect
// Duck interface
interface Duck {
  age: number;
  name: string;
  secretIdentity: string;
  walk(distance:number): void;
  fly(destination:string) : void;
  quack(volume: number): void;
}
					Sort of like free documentation!
For a typical SPA, we might see something like this:
interface Resource<T> {
	route: string;
	get(): T;
	post(value:T): boolean;
	put(values: any): boolean;
	delete(value: T): boolean;
}
				<T> represents a generic type. It gets defined as you use it.
  interface Chicken{
    id: number;
    name: string;
    breed: string;
    weight: number;
  }
  class ChickenResource implements Resource<Chicken>
  {
    route: string;
    get(): Chicken;
    post(value:Chicken): boolean;
    put(values: any): boolean;
    delete(value: Chicken): boolean;
  }
					Let's implement a Graph API in Typescript
Graph's are a data structure which model connections
  interface INode<T>
  {
    // Returns a unique identifier
    _getUId:()=>string;
    // Returns the node data
    _getData:()=> T;
  }
					
  interface IGraph<T>
  {
    _uid:string;
    nodesCount:number;
    addNode(newNode:INode<T>): void;
    addEdge(v: INode<T>, w: INode<T>): void;
    getAdjacentNodes(v: INode<T>): INode<T>[];
    countVertices(): number;
    getNode(id:string): INode<T>;
    //... Plus more goodies...
  }
					Concordance of Ephesians
Typescript adds incredible benefit to team projects:
For this demonstration, we'll add some functionality to a Graph API.