藻のブログ

日記,IT,学問(ジェンダー,人工知能など)について書かれることでしょう。

npm で Optional の TypeScript 実装を公開しました

Java 8 Optional の TypeScript 版を実装し、npm パッケージとして公開しました。

www.npmjs.com

github.com

概要

Optional は、ある型の値を含む場合も含まない場合もあることで、値があるかも知れないしないかも知れないことを表現する型です。Haskell の Maybe に相当します。

解説

従来の Java 7 のような言語では、ある型で型つけされた値が実際には null になる可能性があっても、コンパイラはなんの警告もしなく、実行時に null 参照例外となることがありました。

これを解決して、実行時 null 参照例外を排除する方法として

  1. null になり得る型の null チェックをコンパイラが強制する
  2. 値があるかも知れないしないかも知れないことを表現する型(オプショナル)を用いる

の2つがあります。

筆者が使用したことのある静的型つけ言語では、TypeScript, Kotlin が null チェック強制によるもの,C#(構造体に対してのみ), Java, Haskell がオプショナルによるものでした。(C#, Java では null が排除されたわけではありません。)

null チェック強制による方法は、けっきょく if 文で null チェックを行なわなければならない場合があり、コーディングのめんどくささはあまり変わりません。

いっぽうオプショナルによる方法は、 Java 8 の Optional の例でいえば、クラスが豊富なメソッドを提供しているので、「null になる可能性がある値」に相当する値に対する典型的な操作をたやすく行なえます。

もちろん、C# や Kotlin にも用意されている、値が null のときは代わりにデフォルト値を取得するnull 合体演算子や,null に対するメンバーアクセスではなにごともなく null を返すnull 条件演算子に相当するメソッドも用意されていますが、それ以上のメソッドも用意されています。

TypeScript は null チェックを強制する仕組みがあるので、そのままでも null 参照例外が発生しないプログラミングができますが、より簡潔なコーディングを行ないたいと思い、 Java 8 のオプショナルを移植することにしました。

実装に関して

この Optional 実装では、多態性を有効に用いています。値がある場合のクラスとない場合のクラスを別にすることで、内部実装にすら null を用いることなく、わかりやすい実装を行なうことができました。

github.com