TypeScript勉強ログ #1

新しいこと勉強したくてTypeScript始めました.

まださっきtsc入れたばっかなのであれですが, 取り敢えず.

インストール

npmとSublime Text2で.

npm install -g typescript
npm install -g tsc_completion

あとはtscにパス通したり, TypeScript.sublime-build入れたり, TypeScriptのSyntaxファイル入れたり.
どうせすぐ古くなりそうだからここには書かずその都度ググった方が良いと思う.

Hello World

module First {
	export class HelloWorld {
		constructor( private target : string = "World") {

		};

		say() : void {
			console.log("Hello, " + this.target);
		};
	};

	export class Test {
		static public run() {
			var hw0:First.HelloWorld = new First.HelloWorld();
			hw0.say();

			var hw1:First.HelloWorld = new First.HelloWorld("Me");
			hw1.say();

			var f = (g => g(0));

			console.log(f);
		};
	};
};

First.Test.run();

静的型付け

なんだかんだで, 良いよね, 静的型付け. はまるよね, var型.
Pythonやphpでもそうだったけどさ.
でも, ちょこちょこ書いてみてると,

((number) => number) => number


みたいな型の書き方が分からない.
これは困った. 高階関数の型こそきちんと型付けしたいのに.

で, 取り敢えず,

interface NumericalFunction { (number):number; }

var f : NumericalFunction = (x : number) => x + 1;
var F : (NumericalFunction) => number = (f : NumericalFunction) => f(0);
console.log(F(f));


みたいに, interfaceを使ってtypedefみたいなことやったら出来ることは分かった.

でも, 型変数みたいなのは無さげなので, その場でサクッとTypeに対して

((Type) => Type) => Type


みたいな型を定義は出来ない気がする. 毎回interface書くの…?
うーん.

あと, interfaceの書き方では

interface BinaryOperator { (m : number, n : number) : number; }
var bracket : (BinaryOperator) => BinaryOperator = f => (m, n) => f(m, n) - f(n, m);


だけど, 二変数になったときの感覚がまだ掴めてない.

var add : (number, number) => number = (m : number, n : number) => m + n;


じゃ怒られるし.

と思ったら,

var f : (m : number,n : number) => number = (m : number, n : number) => m + n;


だった. 型宣言でも引数名が要るの…?えー?

var g = (number) => (number) => number;


というのも許された. コンパイルされたjs見たら

var g = function (number) {
    return function (number) {
        return number;
    }
};


になってた. えー…?

今日のまとめ

ちゃんとドキュメント読んで精進します.

追記

まさか,と思って

var h : (f:(number) => number) => number = f => f(0);


ってやったら動いた. なんかわざわざ引数名付けなきゃなのはめんどくさいけど取り敢えず安心して寝れますね.

おやすみなさい.

コメントを残す