【日記を書く26日目】JavaScriptのundefinedとnullって凶悪じゃない?
れみです。最近は自炊をするようにしています。前はあまりやってなかったのですが、自炊はそんなに嫌いではないのでまだ続けられてます。昨日はアヒージョが急に食べたくなったので作りました。ある程度適当に作っても全然美味しくなるって神ですね。
昨日の記事
今日は、タイトルにある通りです。JavaScriptのundefinedとnullって凶悪すぎませんかね。TypeScriptを使うことで、実行時に予期せず値がundefinedになるみたいなことは減りましたが、それでも実装時に気を使うポイントの1つだと思ってます。
TypeScriptはJavaScriptベースにしている以上、TypeScriptを使ってもこの鬱陶しさは消えません。むしろ厄介です。
せっかく静的な型検査ができるのであれば、Option型みたいなものを言語機能として導入したら良いのに、と思ったりもします。まあ、導入しようと思えば全然できるんですけどね。
class None {
readonly tag: 'None' = 'None';
}
class Some<T> {
readonly tag: 'Some' = 'Some';
constructor(readonly value: T) {}
}
type Option<T> = None | Some<T>;
const NONE: Option<never> = new None();
const SOME = function <T>(value: T): Option<T> { return new Some(value) }
これを使うことで、undefinedやnullはなくすことができるのではないでしょうか。
const a: Option<number> = ...
という変数aは、NoneかSomeというデータを持ち、Someであればvalueにnumberという型を持つ値がきます。
でも、TypeScriptで全てのundefinedやnullになる可能性のある値をOption型で表すのはちょっと面倒です。自分の感覚ですが。
const b: { test?: string } = {};
このようなオブジェクトをOption型にするならばこうでしょうか。
const bOption: Option<{ test: string }> = b.test
? SOME({ test: b.test })
: NONE;
これで、bOptionはNoneでないならSomeに入っているvalueを使うことで決してundefinedではない値を使うことができます。でも、undefinedを見たくないがためにOptionを使うのは、もう好みが大きくなってくるかなと。
ネットにも、さまざまな声が記事や投稿になってますよね。でもJavaScriptという言語の仕様なので仕方ないところではあります。結局は、出来上がるプログラムが正しく動くなら、コードでundefinedを使っていても使っていなくても関係ないですから。個人的にはundefinedやnullは見たくないです。
では今日はここまで。
この記事が気に入ったらサポートをしてみませんか?