TypyJS の概要

前回、 TypyJS というライブラリをオープンにしましたと書きましたが、今回はそれの概要です。

前にも書いた通り TypyJS は prototype を拡張しません。 TypyJS の関数を利用するには、基本的には型ごとのオブジェクトでラップします。例えば、 String をラップするのは以下のような感じ。

var str = Typy.str("FooBar");

これで str 変数に TypyStr オブジェクトが設定されます。で、あとは TypyStr オブジェクトの関数を呼ぶだけ。

var str = Typy.str("FooBar");
str = str.lower();

基本的に各関数の戻り値の型が、ラップしているオブジェクトの対象としている型の場合(TypyStrオブジェクトの場合は String 型)は、関数を実行した結果の値が返るのではなく、自身のインスタンスを返します。つまり、チェーンして記述が可能です。

var str = Typy.str("FooBar");
// ↓ upper() 関数の戻り値の型は TypyStr
str = str.lower().upper();

じゃぁ、関数が適用された最終的な値はどうやって取るかというと、val() 関数を利用します。 val() 関数は基本的には組み込みの型の値を返します。

var str = Typy.str("FooBar");
// ↓ val() 関数の戻り値の型は String。この例では "FOOBAR" が返る。
str = str.lower().upper().val();

チェーンして書けて、val() 関数で元の型の値をとるということから、基本的にはラップしているオブジェクトを変数にとることはあまり想定していません。

var str = Typy.str("FooBar").lower().upper().val();

配列とかの操作には便利ですね。ちなみに配列の時は TypyArray を利用します。

var ary = Typy.array([1,2,3,4,[5,6,7],8,9]).
            flatten().
            filter(function(...){...}).
            map(function(...){...}).val();

関数の戻り値が対象としている型ではない場合(厳密には対象としている型を返さない可能性がある関数)は、元の値をそのまま返します。 TypyArray の reduce() 関数とかがそうですね。

var val = Typy.array([1,2,3,4,[5,6,7],8,9]).
            flatten().
            filter(function(...){...}).
            map(function(...){...}).
            reduce(function(...){...});

でも、実際には戻り値の型をもとに自動的にラップするオブジェクトを自動的に判定して、そのままチェーンしていきたい場合もあります。その場合には、各関数に設定されている x() 関数を利用します。

var val = Typy.array([1,2,3,4,[5,6,7],8,9]).
            flatten().
            filter(function(...){...}).
            map(function(...){...}).
            reduce.x(function(...){...}).  //←例えば文字列が返る
            lower().val();

実はここ結構悩ましいところで、実は x() 関数 を使わずに、常に自動的にラップするオブジェクトを自動的に判定したほうがいいのか難しいところです。日付である Date 型を対象とした TypyDate に year() 関数とかがあるのですが、これは素直に値をとりたいところなんで、時と場合によるんですね。そのうち変わってるかもしれません。

チェーンしたくない場合などは毎回ラップすのは結構ばかばかしいです。なので、各関数は基本的には素でよべるようにもしてあります。その場合は、第1引数に対象となる値を設定します。前述の lower() 関数とか upper() 関数とかを素で呼ぶと以下のような感じです。

var str = "FooBar";
str = Typy.str.lower(str);
str = Typy.str.upper(str);

多くの関数は 2 way で使えるようになってるので、いい感じに使い分けてやってください。


ここまでで、ざっくりと使い方を記述しましたが、Typy が今のところ対象としている型は以下があります。

  • TypyObj → Typy.obj()
  • TypyArray → Typy.array()
  • TypyStr → Typy.str()
  • TypyDate → Typy.date()
  • TypyFunc → Typy.func()
  • TypyNum → Typy.num()

これの他に独自の型として以下があります。

  • TypyUuid → Typy.uuid()
  • TypyUri → Typy.uri()
  • TypyTimeSpan → Typy.timeSpan()
  • TypyAny → Typy.any()

また、型ではありませんが、ユーティリティとして以下のようなものがあります。

  • Typy
  • Typy.lang
  • Typy.ext

そのうち、ちゃんとドキュメント書きたいなぁと思ってるのですが、いつになることやら。

最後に TypyJS で動作確認している実行環境は以下の通りです。現存する多くのブラウザで動作すると思われます。

  • IE 10
  • IE 10 の ドキュメントモードを変更して Quirks / 7 / 8 / 9 モード
  • Windows 版 Google chrome / Firefox / Opera の最新版
  • node.js の最新版
  • WinRT アプリ for JavaScript