最初のプログラムと型エラー
この章では、最初のTypeScriptプログラムを作成し、コンパイルと実行を体験します。
この章で学ぶこと
- TypeScriptファイルの作成とコンパイル
- TypeScriptの実行フロー
- 型エラーの検出と対処
- 開発を効率化する機能
この章では前章で構築した開発環境を使用します。typescript-learningディレクトリ内で作業を進めてください。
最初のTypeScriptプログラム
ステップ1: TypeScriptファイルの作成
ファイル名: hello.ts
// 変数の宣言:型注釈を使ってstring型であることを明示
let message: string = 'Hello, TypeScript!';
// コンソールに出力
console.log(message);
// 関数の定義:引数と戻り値の型を明示
function greet(name: string): string {
return `Hello, ${name}!`;
}
// 関数の呼び出し
console.log(greet('World'));
console.log(greet('TypeScript'));
コードの詳細解説:
let message: string = 'Hello, TypeScript!';
let: 変数宣言のキーワード(再代入可能な変数)message: 変数名: string: 型注釈(この変数はstring型であることを宣言)= 'Hello, TypeScript!': 初期値の代入
function greet(name: string): string {
return `Hello, ${name}!`;
}
function: 関数宣言のキーワードgreet: 関数名(name: string): 引数名と型(nameという名前のstring型の引数): string: 戻り値の型(この関数はstring型の値を返す)`Hello, ${name}!`: テンプレートリテラル(変数を埋め込める文字列)${name}: 変数の埋め込み
ステップ2: TypeScriptのコンパイル
# hello.tsをJavaScriptにコンパイル
# tsc: TypeScript Compiler(TypeScriptコンパイラ)
tsc hello.ts
# コンパイル後、hello.jsファイルが生成される
# 確認してみましょう
ls
# hello.ts hello.js
生成されるJavaScriptコード(hello.js):
"use strict";
// 変数の宣言:型注釈を使ってstring型であることを明示
let message = 'Hello, TypeScript!';
// コンソールに出力
console.log(message);
// 関数の定義:引数と戻り値の型を明示
function greet(name) {
return `Hello, ${name}!`;
}
// 関数の呼び出し
console.log(greet('World'));
console.log(greet('TypeScript'));
重要なポイント:
- TypeScriptの型注釈(
: stringなど)はすべて削除される - 先頭に
"use strict";が付与される(TypeScript 6.0 ではstrictがデフォルト有効のため) letやテンプレートリテラルはそのまま残る(デフォルトのtargetが ES2025 のため。TypeScript 5.x まではデフォルトが ES5 だったためvarや文字列結合に変換されていた)- 最終的に実行されるのはこのJavaScriptコード
ステップ3: JavaScriptの実行
# Node.jsでコンパイル後のJavaScriptファイルを実行
node hello.js
# 実行結果:
# Hello, TypeScript!
# Hello, World!
# Hello, TypeScript!
実行フローの全体像
┌─────────────┐ tsc ┌─────────────┐ node ┌─────────────┐
│ hello.ts │ ──────────> │ hello.js │ ──────────> │ Output │
│ (TypeScript)│ Compile │ (JavaScript)│ Execute │ (Console) │
└─────────────┘ └─────────────┘ └─────────────┘
Type info No types "Hello, ..."
型エラーの検出
TypeScript の主な利点である型エラーの検出を体験してみましょう。
例1: 型の不一致
ファイル名: type-error.ts
// string型の変数を宣言
let userName: string = 'John';
// 正常なコード:string型の値を代入
userName = 'Jane';
console.log(userName); // 'Jane'
// エラーになるコード:number型の値をstring型の変数に代入
userName = 123;
// Error: Type 'number' is not assignable to type 'string'.
コンパイルしてみる:
tsc type-error.ts
# エラーメッセージが表示される:
# type-error.ts:9:1 - error TS2322: Type 'number' is not assignable to type 'string'.
#
# 9 userName = 123;
# ~~~~~~~~
エラーメッセージの読み方:
type-error.ts:9:1: ファイル名と行番号、列番号error TS2322: エラーコード(TypeScriptのエラー分類番号)Type 'number' is not assignable to type 'string': エラーの内容- 下部に該当箇所が
~で示される
例2: 関数の引数の型エラー
// number型の引数を2つ受け取り、number型を返す関数
function add(a: number, b: number): number {
return a + b;
}
// 正常な呼び出し
console.log(add(5, 10)); // 15
// エラーになる呼び出し
console.log(add('5', '10'));
// Error: Argument of type 'string' is not assignable to parameter of type 'number'.
console.log(add(5, '10'));
// Error: Argument of type 'string' is not assignable to parameter of type 'number'.
重要な設定: noEmitOnError
TypeScriptには、エラーがあってもJavaScriptファイルを生成するか制御できるオプションがあります。
# エラーがあってもJavaScriptファイルを生成する(デフォルト)
tsc type-error.ts
# エラーメッセージは表示されるが、type-error.jsは生成される
# エラーがある場合はJavaScriptファイルを生成しない
tsc --noEmitOnError type-error.ts
# エラーメッセージが表示され、JavaScriptファイルは生成されない
開発を効率化する機能
ウォッチモード
ファイルの変更を監視し、自動的に再コンパイルする機能です。
# ウォッチモードでコンパイル
tsc hello.ts --watch
# または短縮形
tsc hello.ts -w
# 実行後、以下のメッセージが表示される:
# [11:30:00] Starting compilation in watch mode...
# [11:30:01] Found 0 errors. Watching for file changes.
使い方:
- ウォッチモードを起動
- エディタでhello.tsを編集して保存
- 自動的に再コンパイルされる
- 停止するには
Ctrl+Cを押す
メリット:
- 毎回
tscコマンドを実行する手間が省ける - コードの変更がすぐに反映される
- 開発の生産性が向上
ts-node(TypeScriptを直接実行)
コンパイルせずにTypeScriptファイルを直接実行できるツールです。
# ts-nodeをインストール
npm install -g ts-node
# TypeScriptファイルを直接実行
ts-node hello.ts
# 実行結果がすぐに表示される
# Hello, TypeScript!
# Hello, World!
# Hello, TypeScript!
ts-nodeの仕組み:
通常の方法:
hello.ts → tsc → hello.js → node → Output
ts-nodeを使用:
hello.ts → ts-node → Output(メモリ上でコンパイル&実行)
使い分け:
- 開発中: ts-nodeで素早く動作確認
- 本番環境: tscでコンパイルしてからnodeで実行(パフォーマンスが良い)
試してみよう: 型エラーを体験しよう ★
以下の要件を満たすTypeScriptファイルを作成し、意図的に型エラーを発生させてエラーメッセージを確認してください。
要件:
multiplyという関数を作成(number型の引数2つを受け取り、掛け算の結果を返す)- 正しい呼び出しと、型エラーが発生する呼び出しの両方を試す
ヒント
- 関数の定義:
function multiply(a: number, b: number): number - 正しい呼び出し:
multiply(3, 4)→ 12 - 型エラーの呼び出し:
multiply('3', '4')またはmultiply(3, '4') tsc ファイル名.tsでコンパイルしてエラーを確認
回答と解説
ファイル名: multiply.ts
// number型の引数を2つ受け取り、掛け算の結果を返す関数
function multiply(a: number, b: number): number {
return a * b;
}
// 正しい呼び出し
console.log(multiply(3, 4)); // 12
console.log(multiply(2.5, 4)); // 10
// 型エラーが発生する呼び出し(コメントアウトを外すとエラー)
// console.log(multiply('3', '4')); // Error: 型 'string' の引数を型 'number' のパラメータに割り当てられません
// console.log(multiply(3, '4')); // Error: 型 'string' の引数を型 'number' のパラメータに割り当てられません
コンパイルと実行:
# コンパイル
tsc multiply.ts
# 実行
node multiply.js
# 12
# 10
エラーを確認する場合:
型エラーの行のコメントを外して tsc multiply.ts を実行すると、以下のようなエラーが表示されます:
multiply.ts:11:22 - error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
11 console.log(multiply('3', '4'));
~~~
このエラーメッセージから、TypeScriptが型の不一致を検出し、どの位置でエラーが発生したかを正確に示していることがわかります。これが TypeScript の型安全性によって得られるメリットです。
まとめ
この章で学んだこと:
- TypeScriptの基本的な使い方:
.tsファイルの作成、tscコマンドでコンパイル、nodeコマンドで実行 - 型エラーの検出: TypeScriptがコンパイル時に型の不一致を検出する
- エラーメッセージの読み方: ファイル名、行番号、エラーコード、エラー内容
- 開発効率化: ウォッチモード(
--watch)、ts-node(直接実行)
次の章では、TypeScriptの基本的なデータ型(number、string、boolean、配列)について学びます。
初学者がつまずきやすいポイント
よくある間違い
❌ TypeScriptファイルを直接nodeで実行しようとする
node hello.ts
# → SyntaxError: Cannot use import statement outside a module
原因: Node.jsはTypeScriptを直接実行できない。
解決策:
# 方法1: コンパイルしてから実行
tsc hello.ts && node hello.js
# 方法2: ts-nodeを使用
npx ts-node hello.ts
❌ コンパイルしたのに変更が反映されない
原因: 古い.jsファイルを実行している、または再コンパイルしていない。
解決策:
tsc hello.tsで再コンパイル- ウォッチモード(
tsc --watch)を使用
❌ 型エラーがあるのにJavaScriptファイルが生成される
原因: TypeScriptのデフォルト動作ではエラーがあってもJSファイルを生成する。
解決策:
# エラー時にJSを生成しない
tsc --noEmitOnError hello.ts
❌ 「Cannot find name 'console'」エラー
Cannot find name 'console'.
原因: libオプションが設定されていない。
解決策: tsconfig.jsonを作成するか、tsc --initを実行する。
次に読む
基本の型 へ進みます。TypeScript の最も基本的な型 (プリミティブ / 配列 / オブジェクト / Union) を学びます。