my.code(); Logomy.code();
TypeScript-1.基本的な型と型推論

my.code(); Logomy.code();

  • C++
    • 0.C++の世界へようこそ
    • 1.型システムと制御構造
    • 2.データ集合とモダンな操作
    • 3.ポインタとメモリ管理
    • 4.関数と参照渡し
    • 5.プロジェクトの分割とビルド
    • 6.クラスの基礎
    • 7.クラスを使いこなす
    • 8.継承とポリモーフィズム
    • 9.テンプレート
    • 10.STL ①:コンテナ
    • 11.STL ②:アルゴリズムとラムダ式
    • 12.RAIIとスマートポインタ
  • JavaScript
    • 0.JavaScriptへようこそ
    • 1.基本構文とデータ型
    • 2.制御構文
    • 3.関数とクロージャ
    • 4.'this'の正体
    • 5.オブジェクトとプロトタイプ
    • 6.クラス構文
    • 7.配列とイテレーション
    • 8.非同期処理①: Promise
    • 9.非同期処理②: Async/Await
  • Python
    • 0.環境構築と基本思想
    • 1.基本構文とデータ型
    • 2.リスト、タプル、辞書、セット
    • 3.制御構文と関数
    • 4.モジュールとパッケージ
    • 5.オブジェクト指向プログラミング
    • 6.ファイルの入出力とコンテキストマネージャ
    • 7.例外処理
    • 8.ジェネレータとデコレータ
  • Ruby
    • 0.rubyの世界へようこそ
    • 1.基本構文とデータ型
    • 2.制御構造とメソッド定義
    • 3.すべてがオブジェクト
    • 4.コレクション (Array, Hash, Range)
    • 5.ブロックとイテレータ
    • 6.クラスとオブジェクト
    • 7.モジュールとMix-in
    • 8.Proc, Lambda, クロージャ
    • 9.標準ライブラリの活用
    • 10.テスト文化入門
    • 11.メタプログラミング入門
  • Rust
    • 0.Rustの世界へようこそ
    • 1.基本構文と「不変性」
    • 2.関数と制御フロー
    • 3.所有権
    • 4.借用とスライス
    • 5.構造体とメソッド構文
    • 6.列挙型とパターンマッチ
    • 7.モジュールシステムとパッケージ管理
    • 8.コレクションと文字列
    • 9.エラーハンドリング
    • 10.ジェネリクスとトレイト
    • 11.ライフタイム
  • TypeScript
    • 0.TypeScriptへようこそ
    • 1.基本的な型と型推論
    • 2.オブジェクト、インターフェース、型エイリアス
    • 3.関数の型定義
    • 4.型を組み合わせる
    • 5.ジェネリクス
    • 6.クラスとアクセス修飾子
    • 7.非同期処理とユーティリティ型
my.code(); Logomy.code();

環境構築不要、その場で実践。

ut-code / my-code

Copyright © 2026 ut.code();

ut.code(); について
公式ウェブサイト公式 𝕏 アカウント

第1章: 基本的な型と型推論

JavaScriptでの開発経験がある皆様、TypeScriptの世界へようこそ。 第1章では環境構築を行いましたが、本章からいよいよ具体的なコードを書いていきます。

TypeScriptの最大の武器は「型(Type)」です。しかし、すべてのコードに手動で型を書く必要はありません。TypeScriptは非常に賢い「型推論」という機能を持っており、JavaScriptを書く感覚のまま、安全性を享受できる場面も多々あります。

この章では、基礎となるプリミティブ型、TypeScriptならではの配列やタプルの扱い、そして「何でもあり」な状態をどう制御するかについて学びます。

型注釈の構文 (Type Annotations)

変数を宣言する際、その変数がどのような種類のデータを扱うかを明示することを「型注釈(Type Annotation)」と呼びます。 構文は非常にシンプルで、変数名の後ろに : 型名 を記述します。

ファイルを編集:annotation.ts
// 文字列型の変数を宣言
let message: string = "Hello, TypeScript!";

// 数値型の定数を宣言
const userId: number = 1001;

// コンソールに出力
console.log(message);
console.log(`User ID: ${userId}`);

// エラーになる例(コメントアウトを外すとエディタ上で赤線が出ます)
// message = 123; // Error: Type 'number' is not assignable to type 'string'.
npx tsc annotation.ts && node annotation.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のannotation.tsに書かれている内容を実行します。
Hello, TypeScript!
User ID: 1001
出力されたファイル(編集不可):annotation.js

ポイント: JavaScriptでは変数にどんな値でも再代入できましたが、TypeScriptでは宣言された型と異なる値を代入しようとすると、コンパイルエラー(またはエディタ上の警告)が発生します。これがバグを未然に防ぐ第一の砦です。

主要なプリミティブ型

JavaScriptでおなじみのプリミティブ型は、TypeScriptでもそのまま使用できます。

  • string: 文字列 ("hello", 'world', `template`)
  • number: 数値 (整数、浮動小数点数、NaN, Infinity すべて含む)
  • boolean: 真偽値 (true, false)

注意点として、NumberやString(大文字始まり)はラッパーオブジェクト型を指すため、通常は小文字のnumber, stringを使用してください。

ファイルを編集:primitives.ts
let isDone: boolean = false;
let decimal: number = 6;
let hex: number = 0xf00d;
let color: string = "blue";

// テンプレートリテラルもstring型として扱われます
let summary: string = `Color is ${color} and Hex is ${hex}`;

console.log("Is Done:", isDone);
console.log(summary);
npx tsc primitives.ts && node primitives.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のprimitives.tsに書かれている内容を実行します。
Is Done: false
Color is blue and Hex is 61453
出力されたファイル(編集不可):primitives.js

型推論 (Type Inference)

ここがJavaScript経験者にとって嬉しいポイントです。 変数の初期化と同時に値を代入する場合、型注釈を省略してもTypeScriptが自動的に型を判別してくれます。これを「型推論」と呼びます。

ファイルを編集:inference.ts
// 型注釈がないが、"TypeScript"という文字列から string型 と推論される
let techName = "TypeScript"; 

// 数値が入っているため、count は number型 と推論される
let count = 42;

console.log(`Technology: ${techName}, Count: ${count}`);

// 推論された型と違う値を入れようとするとエラーになる
// count = "Forty-Two"; // Error!
npx tsc inference.ts && node inference.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のinference.tsに書かれている内容を実行します。
Technology: TypeScript, Count: 42
出力されたファイル(編集不可):inference.js

ベストプラクティス: 初期値がある場合、わざわざ : string などを書く必要はありません。コードが冗長になるのを防ぐため、明示的な型注釈は「初期値がない場合」や「推論される型とは別の型として扱いたい場合」に使用するのが一般的です。

特殊な型: any, unknown, never

TypeScriptには「特定のデータ型」ではない特殊な型が存在します。これらは安全性に大きく関わるため、違いを理解することが重要です。

any: 危険な「何でもあり」

any 型は、型チェックを無効にする型です。JavaScriptと同じ挙動になりますが、TypeScriptを使うメリットが失われるため、可能な限り使用を避けてください。

ファイルを編集:any_type.ts
let looseVariable: any = 4;
looseVariable = "Maybe a string instead";
looseVariable = false; // エラーにならない(危険!)
console.log(looseVariable);
npx tsc any_type.ts && node any_type.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のany_type.tsに書かれている内容を実行します。
false
出力されたファイル(編集不可):any_type.js

unknown: 安全な「正体不明」

「何が入ってくるかわからない」場合(例:外部APIのレスポンスなど)は、anyの代わりにunknownを使います。unknown型の変数は、「型の絞り込み(Type Narrowing)」を行わない限り、プロパティへのアクセスやメソッドの呼び出しができません。

ファイルを編集:unknown_type.ts
let uncertainValue: unknown = "I am actually a string";

// uncertainValue.toUpperCase(); // エラー: Object is of type 'unknown'.

// 型チェック(絞り込み)を行うと使用可能になる
if (typeof uncertainValue === "string") {
    console.log(uncertainValue.toUpperCase());
}
npx tsc unknown_type.ts && node unknown_type.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のunknown_type.tsに書かれている内容を実行します。
I AM ACTUALLY A STRING
出力されたファイル(編集不可):unknown_type.js

never: 決して発生しない

never は「値を持たない」ことを意味します。常に例外を投げる関数や、無限ループなど「終了しない関数」の戻り値として使われます。

ファイルを編集:never_type.ts
function throwError(message: string): never {
    throw new Error(message);
}

try {
    // この関数は決して正常に戻らない
    throwError("Something went wrong");
} catch (e) {
    console.log("Error caught");
}
npx tsc never_type.ts && node never_type.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のnever_type.tsに書かれている内容を実行します。
Error caught
出力されたファイル(編集不可):never_type.js

配列とタプル

データの集合を扱う方法を見ていきましょう。

配列 (Array)

配列の型定義には2通りの書き方があります。

  1. 型[] (推奨:シンプル)
  2. Array<型> (ジェネリクス記法)
ファイルを編集:arrays.ts
// 数値の配列
let fibonacci: number[] = [1, 1, 2, 3, 5];

// 文字列の配列(Array<T>記法)
let frameworkList: Array<string> = ["React", "Vue", "Angular"];

console.log("First Framework:", frameworkList[0]);

// fibonacci.push("8"); // エラー: number[] に string は追加できない
fibonacci.push(8); // OK
console.log("Next Fib:", fibonacci[fibonacci.length - 1]);
npx tsc arrays.ts && node arrays.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のarrays.tsに書かれている内容を実行します。
First Framework: React
Next Fib: 8
出力されたファイル(編集不可):arrays.js

タプル (Tuple)

配列に似ていますが、「要素の数が固定」で、「各要素の型が決まっている」ものをタプルと呼びます。CSVの1行や、座標(x, y)などを表現するのに便利です。

ファイルを編集:tuples.ts
// [名前, 年齢, 有効フラグ] の順序と型を守る必要がある
let userTuple: [string, number, boolean];

userTuple = ["Alice", 30, true];
// userTuple = [30, "Alice", true]; // エラー: 型の順序が違う

console.log(`User: ${userTuple[0]}, Age: ${userTuple[1]}`);
npx tsc tuples.ts && node tuples.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のtuples.tsに書かれている内容を実行します。
User: Alice, Age: 30
出力されたファイル(編集不可):tuples.js

この章のまとめ

  • 変数宣言時に : 型名 で型注釈をつけることができる。
  • 初期値がある場合、TypeScriptは自動的に型を推測する(型推論)。
  • プリミティブ型は string, number, boolean を小文字で使う。
  • any は型チェックを無効にするため避け、不明な値には unknown を使う。
  • 配列は同じ型の集まり、タプルは位置と型が固定された配列である。

次回は、より複雑なデータ構造を扱うための「オブジェクト、インターフェース、型エイリアス」について学びます。

練習問題 1: タプルと配列の操作

  1. 「商品名(string)」と「価格(number)」を持つタプル型の変数 product を定義し、["Keyboard", 5000] を代入してください。
  2. 文字列の配列 tags を定義し、型推論を使って ["IT", "Gadget"] で初期化してください。
  3. tags に新しいタグ "Sale" を追加してください。
  4. それぞれの値をコンソールに出力してください。
ファイルを編集:practice2_1.ts
npx tsc practice2_1.ts && node practice2_1.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のpractice2_1.tsに書かれている内容を実行します。
出力されたファイル(編集不可):practice2_1.js

練習問題 2: unknown型の安全な利用

  1. unknown 型の引数 input を受け取る関数 printLength を作成してください。
  2. 関数内で、input が string 型である場合のみ、その文字列の長さをコンソールに出力してください(input.length)。
  3. input が string 以外の場合は、「Not a string」と出力してください。
  4. この関数に 文字列 "TypeScript" と 数値 100 を渡して実行してください。
ファイルを編集:practice2_2.ts
npx tsc practice2_2.ts && node practice2_2.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のpractice2_2.tsに書かれている内容を実行します。
出力されたファイル(編集不可):practice2_2.js
前のページ« TypeScriptへようこそ
次のページオブジェクト、インターフェース、型エイリアス »