前回:麻雀で学ぶTypeScript 5 チー
ソースコード:https://github.com/bonetaro/mahjong-ts
前回チーの実装をしていく中で麻雀における独自Typeを定義しました。
export type 萬子 = "m"; // 英語はCharacters
export type 筒子 = "p"; // 英語はWheels
export type 索子 = "s"; // 英語はBamboos
export type 風 = "w"; // Wind
export type 元 = "d"; // Dragon
export type 数牌の数 = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
export type 数牌の色 = 萬子 | 筒子 | 索子;
export type 萬子牌 = `${数牌の数}${萬子}`;
export type 筒子牌 = `${数牌の数}${筒子}`;
export type 索子牌 = `${数牌の数}${索子}`;
export type 数牌 = 萬子牌 | 筒子牌 | 索子牌; // Suits
export type 東 = `e${風}`; // EastWind
export type 南 = `s${風}`; // SouthWind
export type 西 = `w${風}`; // WestWind
export type 北 = `n${風}`; // NorthWind
export type 白 = `w${元}`; // WhiteDragon
export type 發 = `g${元}`; // GreenDragon
export type 中 = `r${元}`; // RedDragon
export type 四風牌 = 東 | 南 | 西 | 北; // Winds
export type 三元牌 = 白 | 發 | 中; // Dragons
export type 字牌 = 四風牌 | 三元牌; // Honours
export type 牌 = 数牌 | 字牌;
export type 対子like = [牌, 牌];
export type 刻子like = [牌, 牌, 牌];
export type 槓子like = [牌, 牌, 牌, 牌];
export type 塔子like = [数牌, 数牌];
export type 順子like = [数牌, 数牌, 数牌];
export type 雀頭like = 対子like;
export type 面子like = 順子like | 刻子like | 槓子like;
その過程で、TypeScriptの型を活かした実装とは何か?TypeSciptの強みやメリットが分からなくなりました。というよりも、最初からそのようなことは分かっていなくて、JavaScriptに静的な型がついたんだから便利に違いないと思い込んでいたように思います。それなのに便利さが思ったより感じられなくて戸惑っていたのかもしれません。
上記ページあたりや書籍など手あたり次第読みあさりました。
今回プログラムを組んでみた課題感をもって読むまでは、TypeScriptはJavaScriptに静的型がついたものというメリット?だけを意識していました。しかし、普段仕事で使っている同じ静的型付け言語のC#とは、型への向き合い方が違う気がしました(気づくの遅いですね:-P)。C#でプログラミングするときは、言語に標準で用意されているデータ型という道具を使って、どういうクラスを設計するかに意識を置いていました。
一方、TypeScriptではその道具であるデータ型自体をどう設計するかが大事なのでは?と感じました。なるほど、TypeScriptには条件型、テンプレートリテラル型、型推論(infer)、型ガードなどなど、型に関わる用語がわんさかあります。何かしらの違和感がずっとあったのは、道具(=データ型)は与えられるものという先入観があったせいな気がします。TypeScriptでプログラミングしているときはプログラムをプログラムしているというか、一段上の(または単に別の)目線になる必要がある感じがします。視野、発想が狭かったんですね。このあたりは関数型言語(この件とは直接関係ないですが、この記事とか勉強になりました)などのパラダイムも関係しているのかもしれませんが、うまく考えを消化(昇華かも)できません。
落ち着いてみれば、C#とTypeScriptで同じ考え方のプログラミングができるわけがないといえばそうだし、C#ならnull安全を意識したり、シンタックスはコンパイラやIDE(VisualStudio)にずいぶん助けられています。その(ぬるま湯?)環境と、自由奔放なJavaScriptに静的な型システムをプラスしようとしているTypeScriptとでは、目指すベクトルも環境も当然違うはずですよね。TypeScriptではコンパイラやVSCodeへの設定(tsconfig)自体を自分で変更(いってしまえば設計)する必要もあります。
何にしろ一旦の個人的な落とし所としては、TypeScriptなりの「安全」な型のコーディングを意識する、という至極無難で当たり前のもので、何が「安全」なのか、「安全」とは何か、に日々模索していくことにします。逆に言えば、やらないこととして「安全な型」とは何かには手を出しません。「型」とは何か、に手を出すと沼な気がしますので・・、いまはまだ・・。ともかく、この記事を書くまでは何がわからないのかわからない状態だったのが、フォーカスすることが絞れるようになったのが小さくても前進していますかね。
先人はだいぶ前の方にいるみたいですが、自分のペースで追いかけるしかないですね。
自分に何が足りないのか、単に経験なのか、努力なのか、何かしらの視点・知識なのか(才能ってのは言いっこなし)、いずれ振り返ってこの記事を読んだときにどういう気持ちになるかがちょっと楽しみです。アウトプットすることで、将来の自分と比較するための今の自分が残るんですね。アウトプット大事ですね。