メインコンテンツへスキップ
書籍

『TypeScriptコードレシピ集』を執筆しました。TypeScript/JavaScript逆引き入門書

『TypeScriptコードレシピ集』を執筆しました。TypeScript/JavaScript逆引き入門書

鹿野です。『TypeScriptコードレシピ集』を執筆しました。2026年5月28日に技術評論社から発売されます。

JavaScript・TypeScriptの機能を逆引きできる入門書

本書は、JavaScriptやTypeScriptで実現したいことを逆引きできる書籍です。タイトルはすべて「TypeScriptでオブジェクトを表現したい」「オブジェクトのプロパティを省略可能にしたい」など「〜したい」で統一され、それぞれの項目は料理の調理手順のように「レシピ」と呼んでいます。「〜したい」「利用シーン」「Syntax」を各レシピ冒頭にまとめ、自分の目的から逆引きしやすい構成になっています。全14章・177レシピからなり、総ページ数は680ページとなりました。

『TypeScriptコードレシピ集』と銘打っていますが、JavaScriptの初学者や中級者でも学べるよう、JavaScriptの基礎項目も数多く収録しています。

紙面サンプル
紙面サンプル

680ページ・742gのボリューム。もとはその1.5倍あった

TypeScriptコードレシピ集は、全部で680ページありました。いつも料理で使っているTANITAのクッキングスケールで量ったところ、742gありました。厚さは3.3cmあります。TypeScriptの勉強にはもちろん、いざというときの護身用の武器としても使えます。とはいえ、分厚いからといって身構える必要はありません。逆引き本なので最初から通読しなくても、わからないことが出てきたときに辞書のように引いて使えます。

裏話として、執筆中の段階では900ページを超えていました。単純計算でそのページ数だった場合は重量は1kgとなり、その重さの本も体験してみたかったところです。もし900ページを超えた場合、昨今の石油を始めとする原料価格の値上がりにより販売金額が上がってしまい私が1読者であれば手が出しにくいなと思い、編集さんと相談して削りました。こんなところに原料価格の値上がりが響くのかと驚きました。

742gの重さ
742gの重さ
3.3cmの厚さ
3.3cmの厚さ

初学者〜中級者の方にオススメ。自分の子どもに読ませたい

本書は、JavaScriptやTypeScriptの入門者でもつまづかずに進めるよう、基礎的な内容も多く収録しています。1章ではJavaScript・TypeScriptの基礎や環境構築方法を、2章ではJavaScriptの基礎構文を、3章ではTypeScriptの型システムの基礎を学べます。私自身もプログラミングを学んでいる立場なので、難しい言葉にはごまかさずにできるだけ解説をつけています。私には現在2歳半の息子がいるのですが、彼が文字を読めるようになったらこの本を読んで勉強してもらおうと考えています。

はじめて学ぶ方は、まず1〜3章を順番に読んでみてください。基礎が身についたら、あとは「〜したい」から必要なレシピを引いていけます。最初から177レシピすべてを読む必要はないので、気負わず始めてもらえたらうれしいです。

書籍のサンプル
書籍のサンプル

充実したサンプルコードと実例

プログラミングの書籍は、読むだけで身につくものではありません。実際にコードを書き、編集して、変更して挙動を確認してこそ身につくものです。そのために、多くのレシピで実例を掲載しています。また、文中のサンプルコードも実際に試せるように付録としてサンプルコードを公開しています。

コードファイル
コードファイル

推しのレシピ

本書は合計で177レシピあります。その中から、初学者向けの基礎から上級者向けの内容まで、「これは絶対に掲載したい」と強い希望で掲載した「推しのレシピ」を紹介します。

004 TypeScriptをオンラインで手軽に試したい

このレシピで紹介しているTS Playgroundの「Twoslash Queries」記法は、TS Playgroundで「^?」を含むコメントを置くと、その位置にある識別子の型がエディター上にリアルタイムで表示されるものです。TypeScriptの型情報を知りたいときに重宝しています。

024 trueやfalseとみなされる値と、&&、||、??演算子の違いについて知りたい

&&||??0 や空文字 "" をそれぞれどう扱うかを、比較表つきで整理しています。たとえば count || 10count0 のときも 10 になってしまいますが、count ?? 10 なら 0 をそのまま活かせます。書籍内では「特に理由がない限り ?? を使う」ことをおすすめして書いています。

058 絵文字を崩さずに文字数を数えたい

"👨‍👩‍👧‍👦"などの絵文字は、.lengthで文字数を数えると1つの絵文字であるはずなのに11[..."👨‍👩‍👧‍👦"].lengthで数えても7になります。Intl.Segmenterを使うことで、見た目どおりに1文字としてカウントできるようになります。その理由と具体的な手法を解説しています。

117 オブジェクトの型推論結果を保持しつつ型チェックをしたい

as constは型の拡大を防ぐ便利な手法ですが、型チェックができません。satisfiesと組み合わせることで、型推論結果を保持しつつ型チェックができるようになります。私のプロジェクトで頻出しているパターンです。

115 型述語を推論させたい

[12, null, 24, undefined, 48].filter((value) => value != null)の結果が、TypeScript 5.5から自動でnumber[]に絞り込まれるようになりました。従来は(value): value is number =>と型述語を明示しないと絞り込めず、かつその型述語は実装とズレてもエラーにならない危険がありました。TypeScript 5.5がリリースされた瞬間に、私の全プロジェクトに採用した表現です。

TypeScript 7にも対応

TypeScriptの大型アップデートであるTypeScript 7が、6月頃にリリースされる予定です。コンパイラの実装言語がGoになり、コンパイル速度も大幅に向上します。本書は長く使える書籍を目指すため、全コードをTypeScript 7に対応させました。具体的には、移行版となるTypeScript 6と、現在beta版のTypeScript 7の両方で動作検証を行っています。

TypeScript 7での検証

たとえば --baseUrlが廃止されたり、rootDirの挙動が変わったりといった変更がありますが、それぞれ解説の解説では追従しています。このあたりはZennでもTypeScript 7の解説記事として紹介した内容でもあります。

tsgoが公開。TypeScript 7向け新コンパイラのインストール手順と10倍高速化検証zenn.dev TypeScript 7で消えるtsconfigのレガシー設定。target: es5やbaseUrlにサヨウナラzenn.dev

妻と子どもに書籍を見せたかった

執筆の話があがったのは2023年でした。そこから少しずつ執筆を進めていたのですが、本業が終わったあとの時間や休日を使っての執筆作業は当初の想像の何倍も大変で、体力やメンタルがついていきませんでした。そこから第一子の誕生、転職など重なり、「もう執筆を辞めよう」と思うことは少なくありませんでした。また、何度も「この本は本当に価値があるのか」「面白いのか」を自問自答し、進めなくなることが多々ありました。

しかしながら、編集の神山さんの度重なるサポート、妻が私の書いた本を読みたいと言ってくれたこと、私が人生で続けたいのはこういったアウトプットであるという自省を繰り返しながら、最後まで書き上げ、出版に至りました。何より、子どもに自分の単著を読ませたいという夢があったので、その夢が叶いました。

子どもがTypeScriptコードレシピ集を読んでいる様子
子どもがTypeScriptコードレシピ集を読んでいる様子

AIエージェント全盛期の今こそ読んでほしい

時代は今、AIエージェントの全盛期です。私も普段はClaude Codeを始めとするAIエージェントを使ってほぼすべての業務を行っています。では、人間がプログラミングを理解しなくてよくなったかというと決してそんなことはありません。むしろ、AIエージェントが生み出すコードを理解し、レビューし、改善していくためには、今まで以上にプログラミングの知識が必要になったことを痛感しています。本書は、このAIエージェント全盛期の今だからこそ、JavaScriptやTypeScriptの基礎知識をみんなで一緒に身につけたいという願いを込めました。

5/28に発売します

5/28に紙書籍・電子版が同時発売します。TypeScriptをこれから現場で書いていく方の、長く使える一冊になりました。気になった方は、ぜひ手に取ってみてください。

予約・購入は次のページからどうぞ。

TypeScriptコードレシピ集(技術評論社)gihyo.jp TypeScriptコードレシピ集(Amazon)amazon.co.jp

本書で解説している全177レシピ

本書で扱う177の全レシピは次のとおりです。

Chapter 1 JavaScriptとTypeScriptの基礎

  • 001 JavaScriptについて知りたい
  • 002 TypeScriptについて知りたい
  • 003 JavaScriptの基本的な書き方と実行方法を知りたい
  • 004 TypeScriptをオンラインで手軽に試したい
  • 005 TypeScriptの環境構築の方法について知りたい
  • 006 JavaScriptとTypeScriptの型の扱い方の違いについて知りたい
  • 007 JavaScriptとTypeScriptの実行環境の違いについて知りたい
  • 008 TypeScriptのネイティブコンパイラーについて知りたい

Chapter 2 基本構文

  • 009 プログラムの値をログで確認したい
  • 010 定数を使いたい
  • 011 変数を使いたい
  • 012 変数や定数の有効範囲について知りたい
  • 013 プログラムに対してコメントを書きたい
  • 014 条件に応じて処理を分けたい
  • 015 三項演算子で条件に応じて異なる値を取得したい
  • 016 switchで条件に応じて異なる値を取得したい
  • 017 処理を繰り返したい
  • 018 インデックスを使って繰り返し処理をしたい
  • 019 条件を満たす場合だけ処理を繰り返したい
  • 020 繰り返し処理を一部分だけスキップしたい
  • 021 繰り返し処理を途中で抜けたい
  • 022 nullまたはundefinedの場合にデフォルト値を設定したい
  • 023 null/undefinedになり得る値に安全にアクセスしたい
  • 024 trueやfalseとみなされる値と、&&、||、??演算子の違いについて知りたい
  • 025 値の状態に応じて代入したい

Chapter 3 型システム

  • 026 型を明示したい
  • 027 型が何かを推論させたい
  • 028 型に名前を付けたい
  • 029 ユニオン型で複数の型のいずれかを表現したい
  • 030 値そのものしか代入できない「リテラル型」を作りたい
  • 031 複数の型の条件をすべて満たす型を作りたい
  • 032 インターフェースで型を定義したい
  • 033 インターフェースを拡張したい
  • 034 型定義のtypeとinterfaceの違いを知りたい
  • 035 型を後から指定して、さまざまな型に対応する関数やクラスを作りたい
  • 036 ジェネリクスを複数使いたい
  • 037 ジェネリクスの初期値を定義したい
  • 038 ジェネリクスの指定できる型に制限を設けたい
  • 039 関数にジェネリクスを使いたい
  • 040 プロトタイプとプロトタイプチェーンを理解したい

Chapter 4 データ型

  • 041 プリミティブな「データ型」について知りたい
  • 042 数値をJavaScriptやTypeScriptで表現したい
  • 043 数値演算を行いたい
  • 044 ランダムな数値を使いたい
  • 045 数の切り捨て・切り上げ・四捨五入を使いたい
  • 046 数値の最大値・最小値を取り扱いたい
  • 047 2の53乗以上の大きな数値を取り扱いたい
  • 048 文字列を表現したい
  • 049 複数の文字列を連結したい
  • 050 文字列を検索したい
  • 051 文字列を取り出したい
  • 052 文字列を置き換えたい
  • 053 データが存在しないときの「null」を取り扱いたい
  • 054 データが未定義のときの値「undefined」を使いたい
  • 055 真偽値を扱いたい
  • 056 一意なプロパティキーを作りたい
  • 057 ++や+=などの省略演算子を使いたい
  • 058 絵文字を崩さずに文字数を数えたい
  • 059 Web Crypto APIで安全な乱数やキーを生成したい

Chapter 5 配列・オブジェクト

  • 060 配列に型注釈をしたい
  • 061 配列操作におけるコールバック関数の内容について知りたい
  • 062 配列から別の配列を作りたい
  • 063 配列を条件によって絞り込みたい
  • 064 配列をフラット化したい
  • 065 配列の要素を検索したい
  • 066 要素が含まれているかどうかを調べたい
  • 067 配列の要素が条件に合致するかどうかを調べたい
  • 068 配列の要素を集約したい
  • 069 配列の要素を並び替えたり、逆順にしたい
  • 070 配列の要素を追加・削除したい
  • 071 配列の要素を置換したい
  • 072 TypeScriptでオブジェクトを表現したい
  • 073 オブジェクトのプロパティを省略可能にしたい
  • 074 オブジェクトのキー・値・ペアを取得したい
  • 075 配列やオブジェクトをコピー・更新・結合したい
  • 076 配列やオブジェクトをディープコピーしたい
  • 077 繰り返し処理が可能な「イテラブルなオブジェクト」を使いたい

Chapter 6 関数

  • 078 関数について知りたい
  • 079 functionキーワードで関数を扱いたい
  • 080 「アロー関数」を使って関数を定義したい
  • 081 オブジェクトのメソッドを使いたい
  • 082 アロー関数とfunctionの違いを知りたい
  • 083 関数の引数を省略したい
  • 084 引数の初期値を指定したい
  • 085 関数に任意の数の引数を渡したい
  • 086 関数に型を付けたい
  • 087 関数オーバーロードで引数と戻り値の型の組み合わせを複数作りたい
  • 088 関数の引数で分割代入したい
  • 089 Generator関数を使いたい

Chapter 7 高度な型システム

  • 090 unknown型で何でも入れられる型安全な変数を作りたい
  • 091 try...catchのcatchエラーオブジェクトを型安全に扱いたい
  • 092 any型と、その使用を制限する方法を知りたい
  • 093 値を何も返さないvoid型について知りたい
  • 094 固定長の配列「タプル型」を取り扱いたい
  • 095 特定のパターンを持つstring型を定義したい
  • 096 文字列リテラル型の大文字・小文字を変換したい
  • 097 プロパティや配列の要素を読み取り専用にしたい

Chapter 8 非同期処理

  • 098 一定時間後・一定間隔で処理を行いたい
  • 099 Promiseで非同期処理を扱いたい
  • 100 データをフェッチしてレスポンスを処理したい
  • 101 Promiseやfetchで直列処理をしたい
  • 102 Promiseやfetchで並行処理をしたい
  • 103 Promiseやfetchで扱う値の型を明示したい
  • 104 非同期通信をする関数を作りたい
  • 105 fetchで取得したデータの型を実行時に保証したい
  • 106 トップレベルでawaitを使いたい
  • 107 非同期処理を途中でキャンセルしたい
  • 108 Promiseを外部から制御したい

Chapter 9 型の絞り込みと高度な型操作

  • 109 typeofで型の絞り込みをしたい
  • 110 instanceofで型の絞り込みをしたい
  • 111 inで型の絞り込みをしたい
  • 112 オブジェクトの共通のプロパティで絞り込みをしたい
  • 113 型の絞り込み関数を作りたい
  • 114 ランタイム検証と型の絞り込みを両立させたい
  • 115 型述語を推論させたい
  • 116 値の型の拡大(widening)を防ぎたい
  • 117 オブジェクトの型推論結果を保持しつつ型チェックをしたい
  • 118 条件付き型で一致しない型を無効化したい
  • 119 inferキーワードで型を抽出したい
  • 120 オブジェクトのキーを型として扱いたい
  • 121 配列やオブジェクトの要素の型を取得したい
  • 122 定義済みの値から型を抽出したい
  • 123 ジェネリクスで特定のオブジェクト型のプロパティに安全にアクセスしたい
  • 124 satisfies演算子で値が型に合うか確認したい
  • 125 型の条件分岐を行いたい
  • 126 IDなどの文字列を種類別に型安全に扱いたい
  • 127 関数の引数の拡大(widening)を防ぎたい

Chapter 10 ユーティリティ型

  • 128 キーKと値Tを持つオブジェクトを生成したい
  • 129 プロパティを省略可能/必須に変換したい
  • 130 型からプロパティを取り出し/除外したい
  • 131 ユニオン型からメンバーを除外/抽出したい
  • 132 T型からnullとundefinedを削除した型を生成したい
  • 133 関数の戻り値・引数の型を取得したい
  • 134 T型を推論させないようにしたい
  • 135 クラスのコンストラクター引数型とインスタンス型を取得したい
  • 136 Promiseで扱っている値の型だけを抽出したい

Chapter 11 エラーハンドリング

  • 137 実行時エラー(ランタイムエラー)について知りたい
  • 138 標準エラーオブジェクトについて知りたい
  • 139 任意のタイミングでエラーを発生させたい(投げたい)
  • 140 エラーをキャッチし、エラーの内容に応じて処理を続行したい
  • 141 専用のエラーを作成して判別しやすくしたい
  • 142 エラーを連結して原因を追跡したい

Chapter 12 クラス

  • 143 クラスを使いたい
  • 144 クラス内で自身のメンバーにアクセスしたい
  • 145 クラスの継承をしたい
  • 146 親クラスのメソッドを拡張したい
  • 147 継承専用のクラスを作りたい
  • 148 静的なメンバーを定義したい
  • 149 プロパティやメソッドの公開範囲を制御したい
  • 150 ECMAScriptの機能を使って、クラスのメンバーにアクセス制御したい
  • 151 instanceofよりも安全にインスタンスかどうかの確認がしたい
  • 152 getter、setter、accessorを使いたい

Chapter 13 モジュール

  • 153 モジュールについて知りたい
  • 154 変数や関数を他のモジュールで使えるようにexportしたい
  • 155 他のモジュールの変数や関数をimportしたい
  • 156 デフォルトエクスポートを使って主要な値をエクスポートしたい
  • 157 型だけをexport、importしたい
  • 158 importでパスを指定したい
  • 159 動的にモジュールをimportしたい
  • 160 JSONをECMAScript標準の形式でimportしたい
  • 161 ウェブブラウザでもNode.jsでもグローバルオブジェクトを参照したい

Chapter 14 TypeScript設定

  • 162 TypeScriptの設定ファイルtsconfig.jsonについて知りたい
  • 163 compilerOptionsの設定を知りたい
  • 164 tsconfig.jsonの設定を継承したい
  • 165 コンパイル対象とAPIライブラリを設定したい
  • 166 ソースマップを有効にしたい
  • 167 厳格な型チェックを有効にしたい
  • 168 未使用のローカル変数を許可したくない
  • 169 関数で未使用の引数を許可したくない
  • 170 関数での戻り値を必ず明示したい
  • 171 オプショナルプロパティでundefinedを代入不可能にしたい
  • 172 switch文でbreakやreturnを必須にしたい
  • 173 明示されていないプロパティへのドット記法アクセスを禁止したい
  • 174 存在しない可能性がある配列のインデックスアクセスを型安全にしたい
  • 175 モジュール解決と出力形式を設定したい
  • 176 クラスフィールドがオーバーライドされている場合、override 修飾子を強制したい
  • 177 Node.jsでTypeScriptを実行するとき、削除不可能構文をエラーにしたい
TypeScriptコードレシピ集(技術評論社)gihyo.jp TypeScriptコードレシピ集(Amazon)amazon.co.jp