++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

TypeScript(続)

with one comment

その後、ちらほら情報追っかけてみていたり。

使ってみるには

とりあえず、Web IDE的なものがあるのでこれで試してみるのがよさそう。

これのために、公開されているTypeScriptのコンパイラーのソースコードはTypeScript自身で作られてるんですねぇ。

で、Visual Studio上で使うには、プラグインのインストールを。

2012が必須ですが、無料で使えるVisual Studio Express for Webでも利用できるので、「Visual Studioは有料だから使えない」とか思っている人もご安心を。

これに付属しているテンプレートが、ASP.NET MVC/C#プロジェクトだけなんですよねぇ。TypeScriptのアイテム テンプレートが出てくるのもC#プロジェクト内のみ。最近はまあいつものことですが、VBな人は置いてきぼり。

TypeScriptのターゲット

「ASP.NET MVCの価値を高めるもの」くらいの位置づけで考えるのがよさそうな気がしてきた。

もちろんまあ、コンパイル結果がただのJavaScriptなんで、TypeScriptで開発したものをコピって配置して、PHPや他のWebフレームワークから使うことはできますが。

現状、Windowsストア アプリの方のJavaScriptプロジェクトからは利用不可(これもよそからコピってくる方法で使えはしますが)。まあ、Windowsストア アプリでそういう開発がしたければ、普通にC#/XAML使えって話ですが。

そして、まあ、JavaScriptの性能問題を解決できるようなものでもなく、あくまでJavaScriptの延命処置。

ベターJavaScriptでしかなく、JavaScript(TypeScript)で閉じた世界(.NETやWinRTがやってるような他の言語との相互運用や共通型システムがあるわけじゃないし、Roslynみたいなホワイトボックスなコンパイラーはない)。

型情報の追加

TypeScriptは、まあ、名前通りなんですけども、JavaScriptに型情報を追加する(VS上でのリアルタイム型チェックや補完の恩恵受ける)ための拡張といった感じのもの。

なので、既存のJavaScriptコードをそのまま持ってきた上で、追加で型情報を入れるための機能がかなりいい具合。

Structural Typing

継承不要で、同じ名前のメンバーさえ持っていればインターフェイスに代入できるようになるという、動的型システムに非常にマッチした強い型付けの仕組み。

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

function Length2(p: Point)
{
    return p.x * p.x + p.y * p.y;
}

var x = Length2({x: 10, y:20});

関数型言語の類でよく見るし、Go言語なんかでも使われてる型システム。C#にも微妙に欲しいんですよねぇ。静的な型の範囲ではそんなに必要ないんですけども、dynamic使って外部システムと連携したりすると。昔からずっと言ってるんですけども、interface for dynamic。C++ 11に入り損ねたConceptsみたいなもの。

Ambients

要は、宣言のみのクラス・メソッド・変数定義ファイルを作れる機能。

既存のJavaScriptコードをそのまま持ってくると、当然型情報が欠けけてるわけですが、そっちに手を入れず、追加で .d.ts という拡張子のファイルで宣言のみを書いて、型情報を追加できる。

例えば、JavaScript標準の関数に型情報を追加するために、lib.d.tsっていうファイルを提供していて、一部抜粋すると以下のような内容になっています。

declare var NaN: number;
declare var Infinity: number;
declare function eval(x: string): any;
declare function parseInt(s: string, radix?: number): number;
declare function parseFloat(string: string): number;

declareキーワードを付けると、宣言のみの変数、関数を作れます。

ディスカッション

公式サイトのフォーラムにて。

Q. ジェネリックはないの?

計画にはある。1.0までには入れると、0.8の仕様書に明記あり。

JavaScriptへの変換で実現されてる以上、実装方法は「型消去」。

Q. letないの?

要するに、immutableな変数定義。

「TypeScript上で型チェックするだけで、JavaScriptへの変換結果はvarと同じでいいんじゃないの?簡単じゃないの?」と思うかもしれないんですが、そうでもないらしい。

というのも、クロージャーへの取り込みルールとかが変わるので、そこがそこそこ面倒みたい。

ECMAScript 6にもあるし、入れる計画はある。

Q. async/awaitないの?

C# 5.0/VB 11のコード生成結果を調べたことがある人ならわかるとおり、async/awaitはかなり大がかりなコード生成を行っています。

もしTypeScriptにasync/awaitを入れるなら、生成結果のJavaScriptがかなり恐ろしいことになるはず。実装コストや、実行効率的に悩ましいところ。

もちろん、それ以上に便利な機能なので要望かなり多く、実装の検討には入ってもらえそう。

Q. C言語スタイルの「T x」形式の型宣言が欲しかった

C言語スタイルの型宣言は、型の省略が可能な場面になると結構破たんする。

TypeScriptは、JavaScriptがベースで、型の省略が当たり前なので、x: T の方がきれい。

Q. C#のXmlドキュメントみたいな機能ないの?

今、JSDoc形式を調べてるところ。

Q. デリゲートはないの?

インターフェイスを使ってデリゲートもどきを作れるみたい。

interface FooDelegate {

    (a: string, b: number): void;

}

C++の () operator的というか。

まあ、関数型の型指定も => を使ってできるので、これを使えばデリゲート型みたいなのを作る必要性あまり感じませんが。

function Foo(callback: (a:string, b:number) => void)

Q. C#のインターフェイスからTypeScriptのインターフェイス生成できないかな?

Roslyn使って。

広告

Written by ufcpp

2012年10月4日 @ 17:57

カテゴリー: 未分類

コメント / トラックバック1件

Subscribe to comments with RSS.

  1. […] TypeScript(続) « ++C++; // 未確認飛行 C ブログ. 共有:TwitterFacebookいいね:いいね最初の「いいね」をつけてみませんか。 […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。