Skip to content
HAYATOM
Go back

TypeScript入門 基本的な文法と型だけで作るCLIツール - 習慣デイリースコア v0.1

Edit page

Table of contents

Open Table of contents

はじめに

現在TypeScriptを学習中で、書籍「プロを目指す人のためのTypeScript入門(著:鈴木僚太)」を読み進めている。本書は実用的なプログラムコードが中心の書籍で、読み終えた後にアプリケーションが手元に残るわけではないと書籍冒頭でも書かれている。そこで、各章を読み終えた段階で何か動くものを作ることにした。手を動かして作ることで、章の理解も一段と深いものになると考えた。

今回は、第2章の道具(プリミティブ型や演算子、制御構文etc.)だけで完結するプロダクトを制作した。特に、配列やオブジェクトは第3章以降の内容のため、コマンドライン(CLI)上の計算中心のプロダクトを開発した。

第2章の道具

第2章では次の内容を学習した。

作ったもの

今日やった習慣を引数で渡すと、スコア・達成率・ランク・メッセージを返す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回実行して結果を出す」計算機での実装しか作れないと感じた。ソフトウェアがより複雑な処理を可能にするには、大量のデータをまとめる配列・オブジェクトが必要だ。次章以降が楽しみだ。


Edit page
Share this post:

Next Post
レバレッジという考え方 - AIという史上初のレバレッジ