見出し画像

【日記を書く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は見たくないです。

では今日はここまで。

この記事が気に入ったらサポートをしてみませんか?