npm で Optional の TypeScript 実装を公開しました
Java 8 Optional の TypeScript 版を実装し、npm パッケージとして公開しました。
概要
Optional は、ある型の値を含む場合も含まない場合もあることで、値があるかも知れないしないかも知れないことを表現する型です。Haskell の Maybe に相当します。
解説
従来の Java 7 のような言語では、ある型で型つけされた値が実際には null
になる可能性があっても、コンパイラはなんの警告もしなく、実行時に null 参照例外となることがありました。
これを解決して、実行時 null 参照例外を排除する方法として
null
になり得る型のnull
チェックをコンパイラが強制する- 値があるかも知れないしないかも知れないことを表現する型(オプショナル)を用いる
の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
を用いることなく、わかりやすい実装を行なうことができました。