Table of contents
Open Table of contents
はじめに
現在TypeScriptを学習中で、書籍「プロを目指す人のためのTypeScript入門(著:鈴木僚太)」を読み進めている。本書は実用的なプログラムコードが中心の書籍で、読み終えた後にアプリケーションが手元に残るわけではないと書籍冒頭でも書かれている。そこで、各章を読み終えた段階で何か動くものを作ることにした。手を動かして作ることで、章の理解も一段と深いものになると考えた。
今回は、第2章の道具(プリミティブ型や演算子、制御構文etc.)だけで完結するプロダクトを制作した。特に、配列やオブジェクトは第3章以降の内容のため、コマンドライン(CLI)上の計算中心のプロダクトを開発した。
第2章の道具
第2章では次の内容を学習した。
- 文と式(文、式、式文)
- 変数宣言(const, let)と型注釈
- プリミティブ型(各種リテラル:文字列、数値、真偽値、BigInt、null、undefined)とプリミティブ型同士の変換
- 演算子(各種演算子:算術、文字列結合、比較・等価、論理、条件、代入)
- 基本的な制御構文(if / else if / else、switch、while、for)
作ったもの
今日やった習慣を引数で渡すと、スコア・達成率・ランク・メッセージを返すCLIのプロダクトを作成した。
npx tsx src/index.ts <運動> <読書> <睡眠時間>
入力の引数は3つで、<運動>と<読書>は"1"(やった)か"0"(やってない)を入力し、睡眠時間は"7"や"9.5"のような数値とした。引数が省略されたら”0”として扱う。
例えば、npx tsx src/index.ts 1 0 7を入力すると、
--- 今日の習慣スコア ---
運動: ○
読書: ×
睡眠: 7時間 ○
スコア: 2/3(67%)
ランク: A — いい調子。
が出力される。運動・読書は入力が"1"なら1、睡眠時間は7以上かつ9以下なら1とし、それ以外は0とした。
コードの解説
引数が省略されたら”0”は??演算子を活用した。また、睡眠判定の「7以上かつ9以下」は&&を活用した。ランクはif / else if / else、メッセージはswitchの両方を活用して、制御構文を復習した。
コマンドライン引数を渡す
プロダクトはコマンドライン上で動くため、Node.jsのprocess.argvを使用した。今回なら"1"や"7"といった情報を配列に自動で代入し、引数を渡すことができる。ただし、インデックスと中身の対応に注意する必要がある。
| インデックス | 中身 |
|---|---|
[0] | "node" のパス(Node本体) |
[1] | "src/index.ts" のパス(実行ファイル) |
[2] | "1" ← 運動 |
[3] | "0" ← 読書 |
[4] | "7" ← 睡眠時間 |
このような配列になっているため、process.argv[2]~[4]を抽出する必要がある。引数が省略された場合、"0"とするため
const exerciseInput: string = process.argv[2] ?? "0";
で??演算子を使った。さらに、配列の値は全てstring型なので、
const exercise: number = exerciseInput === "1" ? 1 : 0;
条件演算子(三項演算子)を使って、“1”を1にそれ以外は0の数値に対応させた。
if-else文と三項演算子
睡眠判定で「7以上かつ9以下」なら睡眠スコアを1、それ以外なら0とする構文をif-else文で書いた。
let sleepValue: number;
if (sleepHours >= 7 && sleepHours <= 9) {
sleepValue = 1;
}else{
sleepValue = 0;
}
条件分岐ならif文だと反射的に考えていた。でも三項演算子を学習して
const sleepValue: number = (sleepHours >= 7 && sleepHours <= 9) ? 1 : 0;
として書けそうだ。これは一行でシンプルに書けるだけではない。letをconstにできる、つまり「後から書き換わらない」と保証できるという利点があるのではないか。
制作して気づいたこと
制作時に詰まったこととして、「型注釈の忘れ」と「break / defaultの忘れ」があった。型注釈を忘れてもTypeScriptは動くが、これは「書かなくても型が付く」仕組みである型推論の恩恵だと感じた。また、switch文のbreak;とdefault:がなく詰まる部分があった。特にbreak;を忘れるとswitch文が中断されないことで、別のcaseに処理が流れ込むフォールスルーが発生し、TypeScriptではコンパイルエラーとして検出されないので気をつけたい。
最後に、第2章まででは配列・オブジェクトが出てこないので、「1回実行して結果を出す」計算機での実装しか作れないと感じた。ソフトウェアがより複雑な処理を可能にするには、大量のデータをまとめる配列・オブジェクトが必要だ。次章以降が楽しみだ。