TypeScriptさわるぞー #TODO

jsを大きな規模でもちゃんと動くようにしたいと、のたまったので、 偉い人たちが作ったaltjsを勉強させてもらいます ref http://kfly8.hatenablog.com/entry/2013/11/16/005340

#発火村 中、id:gfx 先生におすすめしてもらったTypeScriptを見てみます><

ぱっと見: # TODO

  • jsのsuperset
  • 見た目はほとんど一緒
  • I/Fに型を添えて分かりやすくしている

導入

% npm install -g typescript
% cat > hello.ts
function hello(s: string) {
  return 'hello ' + s;
}
console.log(hello('typescript'));
^D
% tsc hello.ts
% node hello.ts

grunt-typescrpt

npm install grunt-typescript
https://github.com/kfly8/ts-sample

TypeScriptのドキュメントのメモ

Types

// primitive type. ( number, boolean, string, void, null and undefined and user defined enum types)
function hello(str: string) {
    return 'hello' + str;
}

// function type
function hoge(callback: (result: string) => any ) {
    ...
}

hoge(function(result: string) {
    ...
});

// object type

// * object type literal ( ObjectType,ArrayType,FunctionType and ConstructorType  )
var aaa: () => {
    x: number; y: number;
};

// * object type interface // PerlのMouseTypeみたい
interface Friend {
    name: string;
    birthday?: string; # optional field
}

function add(friend: Friend) {
    var name = friend.name;
}

add({ name: 'taro' });
add({ birthday: '20130101' }); # error, name required
add({ name: 'hanako', birthday: '20130201' });


// Structial Subtypes

interface Point {
    x: number;
    y: nubmer;
}

function getX(p: Point) {
}

Class CPoint {
    x: number;
    y: number;
    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

getX(new CPoint(0,0)); // ok!!
getX({ x: 1, y: 2: z: 3); // ok!! Extra fields ok
getX({ x: 1 ); // ng!! supplied parameter's not Point

Class && Module

class Animal { 
    constructor(public age: number) {
    }
    addAge(amount: number) { 
        this.age += amount; 
        return this.age; 
    } 
}
var Animal = (function () { 
    function Animal() { 
        this.age = 0; 
    } 
    Animal.prototype.addAge = function(amount) { 
        this.age += amount; 
        return this.age; 
    }; 
    return Animal; 
})(); 
module Hoge { 
    var s = "hello"; 
    export function f() { 
        return s; 
    } 
} 

Hoge.f(); 
Hoge.s; // Error, s is not exported // variable 's' is private
var Hoge; 
(function(exports) { 
    var s = "hello"; 
    function f() { 
        return s; 
    } 
    exports.f = f; 
})(Hoge||(Hoge={})); 

declare

declare var document; 
document.title = "Hello"; 

外部モジュール

# File main.ts: 
import log = require("log"); 
log.message("hello"); 

# File log.ts: 
export function message(s: string) { 
    console.log(s); 
} 
# point.ts
export = Point; 
class Point { 
    constructor(public x: number, public y: number) { } 
    static origin = new Point(0, 0); 
} 

# use
import Pt = require("point"); 
var p1 = new Pt(10, 20); 
var p2 = Pt.origin; 

温泉発火村なう

#発火村 !!!!!!!!!!!