ZZ. 資料の構成

Node+JavaScript/Java/C# のいずれかを知っている読者を対象にした、本編12章+付録4本のカリキュラム設計

📅 作成: 2026-08-28 / 更新: 2026-08-29 / ステータス: 本編12章 + 付録4本 完成

目次

  1. 全体方針と対象読者
  2. 資料16本の構成とロードマップ
  3. 基礎編(01〜04)の詳細
  4. 型システム編(05〜09)の詳細
  5. 実践編(10〜12)の詳細
  6. 付録(A1〜A4)の詳細
  7. 勉強会の進行案
  8. 資料のビルドと運用

ZZ.1 全体方針と対象読者

3種類の読者を1つの資料でカバーする

この資料は読者を3種類想定します。Node+JavaScript の開発経験がある人Java を知っている人C# を知っている人です。どの読者も、変数・条件分岐・繰り返し・関数・クラスは理解している前提です。

読者ごとに資料を分けると保守が3重になるため、本文は JavaScript 経験者向けに書き、Java・C# 経験者が引っかかる箇所だけ補足枠を添える方式にします。TypeScript は JavaScript の上に型を足した言語であり、本文の土台を JavaScript に置くのが構造的に自然だからです。

読者A Node + JavaScript 経験者 読者B Java 経験者 読者C C# 経験者 補足枠 「Java・C# から来た人へ」 TypeScript 学習資料 本文は JavaScript 基準 本編12章 + 付録4本 そのまま本文へ
図 1 — 資料を分けず、補足枠で3種類の読者を吸収する

プログラミング未経験者は対象外とします。

「変数とは」「関数とは」から始めると分量が数倍になり、経験者には冗長な資料になります。読者はすでに何らかの言語を書けるという前提を置くことで、TypeScript 固有の話に集中できます。

本文を書くときの5原則

原則内容理由
[原則1]同じ処理の JavaScript を必ず並べるTypeScript は JavaScript の拡張。「JS ではこう書いていた/型を付けるとこうなる」が最も速い導線になる
[原則2]Java・C# 経験者が引っかかる箇所だけ補足枠を置く静的型付けの経験がかえって邪魔をする場面(構造的型付け・型消去・変性)が存在する
[原則3]「なぜそうなっているか」を先に書くstrictmoduleResolution は理由を知らないと必ず忘れる
[原則4]動かせる短いコードで終わる各節の最後に npx tsx でそのまま実行できる5行以内の例を置く
[原則5]設定差・環境差はバッジで示すコピペして動かなかったとき、原因が設定差だと分かるようにする

補足枠に書くこと・書かないこと

読者がプログラミングの基礎を持っている前提により、補足枠の中身は絞り込めます。書くのは静的型付け言語の経験者が TypeScript で誤解する点だけです。

判定内容
書くJava・C# と仕組みが根本的に違う点構造的型付け、型は実行時に消える、ジェネリクスに実行時情報がない
書く同名だが意味が異なる用語interfaceenumreadonlyprivate
書くJavaScript 側の前提知識プロトタイプ、undefinednull の使い分け、イベントループ
書かないプログラミングの基礎概念変数とは、関数とは、クラスとは、条件分岐とは
書かない本文の単なる繰り返し本文で説明済みの内容を言い換えただけの枠

枠の見出しは「Java・C# から来た人へ」で統一します。

「はじめての人へ」だと未経験者向けに読めてしまいます。補うのは静的型付け言語との差分であって、プログラミングそのものではないことを見出しで示します。

バッジの使い方

TypeScript は同じコードでも設定と実行環境で結果が変わる言語です。差がある箇所だけ、その場でバッジを示します。

バッジ意味使用例
strictstrict: true のときだけエラーになる/挙動が変わるnull チェックの強制、暗黙の any の禁止、関数引数の反変チェック
ESMCJSモジュール形式で書き方が変わるimport の拡張子指定、__dirname の有無、require との相互運用
Node型ストリップNode が .ts を直接実行する場合の制約enumnamespace・パラメータプロパティが使えない
TS7TypeScript 7 と 5 系で挙動が違うstrict が既定で有効@typestypes の明示が必要、TS5112
(なし)どの環境でも同じ。大半の内容バッジを付けない

設定バッジは判定バッジと色相帯を分けます。

判定バッジ(良い悪い警告未実施)と同じ色を使うと、strict が「良いこと」に読めてしまいます。設定バッジは事実を示すだけで、良し悪しの評価ではありません。藍・青緑・茶・紫を割り当て、緑・赤・橙・灰とは重ならないようにします。

バッジを付けすぎない。

どこでも動く内容にまで付けると、本当に注意が必要な箇所が埋もれます。コピペして動かなかったときに原因が設定差だと分かることが目的なので、差がある箇所に限定します。

1ファイルの構成テンプレート

位置内容目的
冒頭この章で何ができるようになるか(3行)読む前に到達点を示す
各章 (h1)概念 → JavaScript との対比 → TypeScript の書き方 → 短い実例既知から未知へ橋を架ける
補足枠.callout で「Java・C# から来た人へ」読者B・Cの補足。読者Aは飛ばせる
末尾まとめ表 + 次章への導線復習と連続性

番号の付け方 — 「資料番号.章番号」で通す

資料全体で番号体系を1つに揃えます。資料 01 の中の章は 01.101.2…、付録 A1 の中の章は A1.1A1.2… とします。どの番号を見ても、どの資料のどこかが一意に決まります。

場所表記
README の資料一覧資料番号 + 太字のタイトル01. 背景
各資料の目次資料番号.章番号 + 太字のタイトル01.2 TypeScript は「検査して、型を消す」だけ
各資料の見出し (h1)資料番号.章番号 + タイトル01.2 TypeScript は「検査して、型を消す」だけ
他の資料からの参照資料番号.章番号「詳細は 08.3 で扱います」

章番号だけ CSS カウンタで自動採番します。

目次の a::beforecontent: "01." counter(tocnum) の形にすると、資料番号は固定文字列、章番号だけが自動採番されます。章を増減しても番号を書き直す必要がありません。

ただし README の資料一覧はカウンタを使えません。0112A1A4 で番号体系が違うためです。ここだけは直書きし、資料を増減したときに手で直します。h1 の見出しも直書きです。

エラーメッセージの載せ方

tsc のエラーは既定で英語です。実際に出力される英語をそのまま載せ、日本語訳を添えます。

// error TS2353: Object literal may only specify known properties,
//               and 'namae' does not exist in type 'User'.
//
// 訳: オブジェクト リテラルは既知のプロパティのみ指定できます。
//     'namae' は型 'User' に存在しません。
項目方針
英語を先に置くエラー番号で検索したとき、英語のほうが情報が見つかります。読者が実際に目にするのも英語です
訳の出典tsc --locale ja の出力に合わせます。独自に訳しません(読者が日本語表示にしたとき、文言が一致します)
表示形式--pretty の形式(ファイル:行:桁 - error TSxxxx:)に合わせます
省略長いメッセージは折り返して載せます。... で省略しません

ZZ.2 資料16本の構成とロードマップ

本編12章+付録4本を通し番号で扱う

本編と付録は1つの連続したリストとして並べ、目次の色も 01 から A4 まで通しで割り当てます。本編を読み終えた読者がそのまま付録へ進めること、逆引きで飛び込んだ読者が本編との位置関係を色で把握できることを狙っています。

第1部 基礎編 01〜04 / 書いて動かす 01 背景 02 実行環境 03 tsconfig 04 型の基本 第2部 型システム編 05〜09 / 資料の山場 05 構造的型付け 06 any・unknown・アサーション 07 関数の型 08 型の絞り込み 09 ジェネリクス 第3部 実践編 10〜12 / 実務と演習 10 モジュールと宣言ファイル 11 非同期とエラー処理 12 ハンズオン 付録 A1〜A4 / 必要なときに引く A1 逆引き A2 型レシピ集 A3 実務パターン集 A4 型レベルプログラミング 到達目標 型の付いた .ts を自分で書き、tsc の吐くエラーを自力で読み解いて直せる状態にする
図 2 — 3部構成と付録のロードマップ。付録は本編を読み終えた後も引き続き使う

資料一覧

No.タイトル扱う内容色相
01背景TypeScript は何を解決したか、型は実行時に消える、JSDoc・Flow との違い、Java/C# のコンパイルとの決定的な差280
02実行環境tsctsx・Node の型ストリップ・Bun/Deno、npm と @types、エディタと言語サーバ261.3
03tsconfigstrict 系の各項目、targetmodulemoduleResolution、パス解決。最大の詰まりどころ242.7
04型の基本プリミティブ、配列、オブジェクト型、union・リテラル型、typeinterface の使い分け224
05構造的型付け山場①。名前的型付けとの違い、互換性の判定、余剰プロパティチェック205.3
06any・unknown・型アサーション型検査から降りる3つの方法とその代償。any の伝播、as が嘘をつく瞬間186.7
07関数の型シグネチャ、省略可能引数、オーバーロード、コールバックの型、戻り値の推論168
08型の絞り込み山場②typeofin/判別可能ユニオン、型ガード関数、never による網羅性チェック149.3
09ジェネリクス制約、型引数の推論、Java/C# のジェネリクスとの違い(変性・実行時情報なし)130.7
10モジュールと宣言ファイルESM と CJS の相互運用(実務で最も事故る)、.d.ts、型定義のないライブラリへの対処112
11非同期とエラー処理Promise の型、asyncawaitcatchunknown である理由、例外と戻り値の使い分け93.3
12ハンズオン勉強会用の課題と解答例。JSON を読んで型を付け、集計して出力するまで74.7
A1逆引き4つの入口から本編へ引く索引 — やりたいこと/tsc のエラー番号/JS・Java・C# の構文/用語56
A2型レシピ集型定義の断片Result 型、型ガード関数、設定オブジェクト型、ブランド型、判別可能ユニオンの雛形37.3
A3実務パターン集動くコードのまとまり。外部入力(JSON)の検証、環境変数、API クライアント、CLI 引数、ファイル I/O18.7
A4型レベルプログラミングMapped Types・Conditional Types・テンプレートリテラル型・ユーティリティ型0

付録は A1A4 の記法にします。

本編の 0112 は順に読む前提ですが、付録は必要になったときに引くものです。番号体系を変えることで、読者が「順番に読まなくてよい」と判断できます。ファイル名でも 12- の後ろに並ぶため、一覧の見た目も崩れません。

A2 と A3 の切り分け

付録の A2 と A3 は粒度で分けます。同じ話題が両方に登場することがありますが、読者の入口が違います。

付録何から引くか中身
A2こういうを書きたい型定義の断片。単体で完結するResult<T, E> の定義、isUser のような型ガード関数、ブランド型
A3こういう処理を書きたい動くコードのまとまり。そのまま貼って使えるJSON ファイルを読んで検証し、型の付いた値として返す一式

読む順序の依存関係

05「構造的型付け」と 08「型の絞り込み」が本資料の2つの山場です。

05 は Java・C# 経験者が最もつまずく箇所、08 は JavaScript 経験者が最もつまずく箇所です。読者によって難所が違うため、どちらも時間を厚く取ります。

README の構成 — 目次までを1画面に収める

README を開いた読者の目的は読むことではなく、目的の資料へ移動することです。案内や約束事を先に長く置くと、リンクにたどり着く前に読者が疲れます。読者への案内は2〜3行に留め、すぐ目次を出します。

位置内容分量と方針
1タイトルバー資料名と日付のみ
2読者への案内2〜3行。「誰向けか」と「何ができるようになるか」だけ。読者が自分向けの資料かを判断できれば足りる
3目次(16本)通し色のバッジ。ここまでを1画面に収める
4この資料の約束事バッジの意味、補足枠の見出し、コードの前提(バージョン・実行方法・文字コード)
5読み方順に読む場合と、目的から引く場合の2通り
6勉強会で使う場合5回の割り当て表のみ。詳細はこの構成案へリンク

説明は目次より後ろに置きます。

順に読む読者は目次を飛ばして下へ進み、目的の資料を探しに来た読者は目次で離脱します。どちらの読者も損をしない順序がこれです。逆にすると、後者が毎回同じ説明をスクロールで飛ばすことになります。

README には資料作成向けの情報を書かない

README は読者だけのためのページです。資料を作る側・運用する側の情報は README に置かず、この構成案に集めます。

README に書かないもの置き場所README での扱い
HTML が原本であること、Markdown の生成手順この構成案 ZZ.8書かない
設計方針・執筆原則・章立ての意図この構成案 ZZ.1〜ZZ.6書かない
勉強会の時間配分・進行(主催側)この構成案 ZZ.75回の割り当て表と、参加者の事前準備だけを書く
ディレクトリ構成・ビルド手順・文字コード規則この構成案 ZZ.8書かない(読者が書くコードの文字コードだけは約束事に書く)
構成案の中身(対象読者・章立ての意図・執筆方針)この構成案リンクだけを「この資料について」に置く

構成案は公開しますが、読む前提にはしません。

この構成案は読者にも見せる資料として docs/ZZ-構成.html に置いています。ただし読まなくても本編は読めます。README では「この資料について」の中にリンクを1つ置くだけにし、目次(資料一覧)には並べません。本編・付録と同じ列に置くと、読むべきものだと受け取られるためです。

同じ説明を2か所に書かない

README・各資料・この構成案で内容が重複すると、片方だけ直して食い違います。項目ごとに「どこに書くか」を1か所に決め、他の場所では繰り返しません。

内容書く場所他の場所での扱い
対象読者・前提知識README の案内各資料では繰り返さない
各資料が何を扱うかREADME の目次各資料の冒頭には到達点(この章で何ができるようになるか)を書く。扱う内容の再掲はしない
バッジの意味README の約束事各資料では使うだけ。凡例を再掲しない
環境構築の手順02 実行環境README はリンクのみ。手順を書かない
勉強会の進行この構成案README は5回の割り当て表のみ
執筆方針・原則この構成案README・各資料には書かない
用語の定義初出の資料以降の資料は初出章へリンクする

ZZ.3 基礎編(01〜04)の詳細

01. 背景

「なぜ型を書くのか」ではなく、「TypeScript の型がどういう立場のものか」を最初に据えます。ここを誤解したまま進むと、後の章がすべて歪みます。

02. 実行環境

03. tsconfig

読者が最も詰まる章です。設定項目を網羅列挙するのではなく、「この設定が無いと何が起きるか」の順で並べます。

04. 型の基本

ZZ.4 型システム編(05〜09)の詳細

05. 構造的型付け

山場①。Java・C# 経験者にとって最も違和感のある部分です。「同じ形なら同じ型として通る」という判定基準を、通る例と通らない例の両方で示します。

06. any・unknown・型アサーション

型検査から降りる3つの方法と、それぞれの代償を扱います。実務で型が壊れる原因のほとんどがここです。

07. 関数の型

08. 型の絞り込み

山場②。TypeScript を「書ける」から「使える」に変える章です。

09. ジェネリクス

ZZ.5 実践編(10〜12)の詳細

10. モジュールと宣言ファイル

実務で最も事故が多い領域です。型の話というより、Node のモジュール解決の話が中心になります。

11. 非同期とエラー処理

12. ハンズオン

勉強会の最終回に対応します。課題は1本の実用スクリプトに絞り、それを段階的に完成させる形にします。

ハンズオンは「型を後から付ける」順序で進めます。

実務で TypeScript を導入する場面は、既存の JavaScript に型を足す形が大半です。最初から完成形の型を書かせるより、any を潰していく過程を体験させるほうが実務に近くなります。

ZZ.6 付録(A1〜A4)の詳細

本編との役割の違い

本編は読んで理解するもの、付録は手を動かしている最中に引くものです。付録は通読を前提にせず、どこから開いても意味が通るように書きます。

A1. 逆引き — 4つの入口

入口読者の状況
やりたいこと書きたい処理は決まっている「オブジェクトの一部だけ省略可能にしたい」
エラー番号tsc のエラーが読めないTS2322TS2345TS7006TS2339
他言語の構文JS・Java・C# での書き方は知っている「Java の Optional に相当するものは」
用語言葉の意味が分からない「判別可能ユニオン」「型消去」「変性」

エラー番号からの入口が、PowerShell 資料の逆引きとの最大の違いです。

TypeScript のエラーメッセージは長く、番号でしか検索できない場面が多くあります。頻出のエラー番号を実際のメッセージ全文とともに載せ、原因と修正を対にします。

A2. 型レシピ集

型定義の断片を集めます。Result 型、型ガード関数、設定オブジェクト型、ブランド型、判別可能ユニオンの雛形、部分更新用の型など。1レシピは20行以内に収め、使いどころと落とし穴を1〜2行添えます。

A3. 実務パターン集

そのまま貼って使えるコードのまとまりを集めます。A2 との違いは粒度で、こちらは「処理として完結していること」を条件にします。

A4. 型レベルプログラミング

ライブラリの型定義を読むために必要な道具立てを扱います。「書けなくても読めればよい」という線引きを冒頭で明示し、実務で書く必要が出る範囲だけ深掘りします。

ZZ.7 勉強会の進行案

全5回・1回90分

範囲ねらい難度
第1回01〜03環境を動かす。全員が tsc の通る状態を作る
第2回04〜06型を書く。any に逃げない習慣をつける
第3回07〜08山場。絞り込みと網羅性チェック
第4回09〜11ジェネリクスとモジュール。実務の事故を潰す
第5回12ハンズオン

1回あたりの時間配分

時間内容
10分前回の振り返りと質問
50分資料の読み合わせ。要所で手を止めて各自実行
25分その回の演習
5分次回範囲の予告

事前準備(参加者)

第1回の冒頭で環境構築に時間を溶かさないことを最優先にします。

PowerShell 資料の勉強会でも同じ問題が起きます。参加者の環境が揃っていないと、その回の内容に入る前に時間が尽きます。事前準備の3点は必須条件として案内します。

ZZ.8 資料のビルドと運用

HTML が原本

各資料は HTML と Markdown の両方を用意し、HTML を原本とします。内容を直すときは HTML を編集し、そのあと変換スクリプトで .md を作り直します。Markdown を直接編集しません。

ディレクトリ構成

typescript-learn/
├─ index.html              README.html へのリダイレクト
├─ README.html             原本(目次・約束事・逆引き入口)
├─ README.md               生成物
├─ docs\                   公開資料(読者に配るもの)
│   ├─ 01-背景.html 〜 12-ハンズオン.html
│   ├─ A1-逆引き.html 〜 A4-型レベルプログラミング.html
│   ├─ ZZ-構成.html         このファイル
│   ├─ *.md                生成物
│   ├─ images\             切り出した SVG(Markdown 生成時に作る)
│   └─ samples\            動作確認済みサンプル(.ts)
├─ etc\c.bat
└─ tmp\

サンプルコードの文字コード

対象文字コード改行理由
.ts.jsonUTF-8(BOM なし)LFNode・tsc の既定。BOM があると設定ファイルの解析に失敗する場合がある
.cmd.batSJIS(CP932)CRLFUTF-8 で保存すると日本語が化けて構文エラーになる
.ps1BOM 付き UTF-8CRLFBOM が無いと Windows PowerShell 5.1 で日本語が壊れる

サンプルコードは実際に動かしてから載せる

資料に載せるコードと出力の両方を、実際に動かした結果から貼ります。記憶や推測で書きません。

場所用途git
tmp\検証用の使い捨てプロジェクト。npm initnode_modules はここに置く管理外
docs\samples\動作確認が済んだサンプル。資料から参照する管理対象
# 検証用プロジェクトの作り方
cd tmp
npm init -y
npm i -D typescript tsx

npx tsc --version          # バージョンを実測する
npx tsc --noEmit ファイル名.ts   # 型エラーの実物を得る
npx tsx ファイル名.ts            # 実行結果の実物を得る

バージョンは必ず実測します。

この構成案を書いた時点では TypeScript 5.x 系を想定していましたが、実際の環境は 7.0.2 でした。想定と実機は食い違います。動作確認環境は README に明記し、実測した値を書きます。

本資料は TypeScript 7.0.2 と 5.9.3 の両方で検証しました。エラーメッセージ・--pretty の表示形式・出力される JavaScript のいずれにも差はありません。実行環境は Node.js 26 系を対象とします。

検証で出たエラーが、書いたコードのものとは限りません。

検証中、プロジェクトの親ディレクトリにある node_modules\@types\nodetsc が拾い、無関係な型定義エラーが6件出ました。TypeScript のバージョン差だと誤認しかけましたが、原因は環境でした。自分のファイル名が行頭にないエラーは、まず環境を疑います。

この資料は .ts.cmd で文字コードの規則が逆になります。

サンプルを動かす .cmd ランチャーと、その中身の .ts が別の規則になるため、どちらのファイルを編集しているかを常に意識する必要があります。02 の章でこの点に触れます。

Markdown の生成と検証

資料をコピーして次の資料を作るときに書き換える箇所

既存の資料(例: 01-背景.html)をコピーして 02 を作る場合、書き換え忘れると前の資料の情報が残る箇所があります。特に下の2つは、見た目が崩れないため気づきません。

箇所書き換える内容(01 → 02 の例)見落としやすさ
<title>01 背景 —02 実行環境 —
タイトルバーh1 と lead の文言
目次の資料番号CSS の content: "01." counter(tocnum)"02."
章見出しの番号01.1〜 → 02.1
.chNN の色相章数が変われば全章を再計算(刻み = 280 ÷(章数 − 1))
SVG の <defs> idg-01-1ag-02-1a
次章への導線末尾のリンク先

この2つは CSS と SVG の中にあるため、本文を読み返しても見つかりません。

目次の資料番号を直し忘れると、02 の目次が 01.1〜と表示されます。本文の見出しは 02.1 なので、目次と本文で番号が食い違います。SVG の id は、重複しても片方の図が正しく表示されることがあり、崩れて初めて気づきます。機械的に確認します。

# 目次の資料番号がファイル名の番号と一致しているか
Select-String -Path docs\*.html -Pattern 'content: "([0-9A]\w)\." counter'

# SVG の defs id に、そのファイルの番号が入っているか
Select-String -Path docs\*.html -Pattern '<(?:linearGradient|marker|clipPath|filter) id="([^"]+)"'

章を増減したときの手順