SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

マンガで分かるプログラミング用語辞典

「ジェネリクス」
~マンガでプログラミング用語解説

マンガで分かるプログラミング用語辞典(273)

解説

 「ジェネリクス」(総称型)は、静的型付け言語において、個別の型ではなく汎用的な型として書くための仕組みです。

 型の異なる複数の関数やクラスなどを作る必要がなくなり、コードをシンプルに保つことができます。

サンプル

 「ジェネリクス」のサンプルです。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>「ジェネリクス」のサンプル</title>
    <style>
body { font-size: 2em; line-height: 150%; }
    </style>
  </head>
  <body>
    <h2>コード</h2>
    <pre id="code-ts"></pre>
    <hr>
    <h2>実行結果</h2>
    <pre id="output"></pre>

    <script type="TypeScript" id="ts">
// 型を直接書くと、別の型の場合に型チェックに失敗する
function packNum(v1: number, v2: number): number[] {
    return [v1, v2];
}
print("引数が数値と数値: " + packNum(1, 2));
print("引数が文字列と文字列: " + packNum("a", "b"));

print("--");

// ジェネリクス使うことで解決
function pack<T>(v1: T, v2: T): T[] {
    return [v1, v2];
}
print("引数が数値と数値: " + pack<number>(1, 2));
print("引数が文字列と文字列: " + pack<string>("a", "b"));
print("引数が真偽値と真偽値: " + pack<boolean>(true, false));

// 引数の型が一致していないとエラーが出る
print("引数が数値と文字列: " + pack<number>(1, "b"));

print("--");

print("型推論を使い、型引数<~>を省略");
print("引数が数値と数値: " + pack(1, 2));
print("引数が文字列と文字列: " + pack("a", "b"));
print("引数が真偽値と真偽値: " + pack(true, false));

// 引数の型が一致していないとエラーが出る
print("引数が数値と文字列: " + pack(1, "b"));

print("--");

// 型の種類を絞る 数値か文字列でないとエラーが出る
function pack2<T extends number|string>(v1: T, v2: T): T[] {
    return [v1, v2];
}
print("引数が数値と数値: " + pack2<number>(1, 2));
print("引数が文字列と文字列: " + pack2<string>("a", "b"));
print("引数が真偽値と真偽値: " + pack2<boolean>(true, false));
    </script>

    <script src="https://cdn.jsdelivr.net/npm/typescript@5.1.6/lib/typescript.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/esbuild-wasm@0.19.12/lib/browser.min.js"></script>
    <script type="module">
    import { init } from './ts_check.js';
    init('https://cdn.jsdelivr.net/npm/esbuild-wasm@0.19.12/esbuild.wasm')
    </script>
  </body>
</html>

出力結果

コード
// 型を直接書くと、別の型の場合に型チェックに失敗する
function packNum(v1: number, v2: number): number[] {
    return [v1, v2];
}
print("引数が数値と数値: " + packNum(1, 2));
print("引数が文字列と文字列: " + packNum("a", "b"));
        // [ERROR] 6:32 - Argument of type 'string' is not assignable to parameter of type 'number'.

print("--");

// ジェネリクス使うことで解決
function pack<T>(v1: T, v2: T): T[] {
    return [v1, v2];
}
print("引数が数値と数値: " + pack<number>(1, 2));
print("引数が文字列と文字列: " + pack<string>("a", "b"));
print("引数が真偽値と真偽値: " + pack<boolean>(true, false));

// 引数の型が一致していないとエラーが出る
print("引数が数値と文字列: " + pack<number>(1, "b"));
        // [ERROR] 19:39 - Argument of type 'string' is not assignable to parameter of type 'number'.

print("--");

print("型推論を使い、型引数<~>を省略");
print("引数が数値と数値: " + pack(1, 2));
print("引数が文字列と文字列: " + pack("a", "b"));
print("引数が真偽値と真偽値: " + pack(true, false));

// 引数の型が一致していないとエラーが出る
print("引数が数値と文字列: " + pack(1, "b"));
        // [ERROR] 29:31 - Argument of type 'string' is not assignable to parameter of type 'number'.

print("--");

// 型の種類を絞る 数値か文字列でないとエラーが出る
function pack2<T extends number|string>(v1: T, v2: T): T[] {
    return [v1, v2];
}
print("引数が数値と数値: " + pack2<number>(1, 2));
print("引数が文字列と文字列: " + pack2<string>("a", "b"));
print("引数が真偽値と真偽値: " + pack2<boolean>(true, false));
        // [ERROR] 39:30 - Type 'boolean' does not satisfy the constraint 'string | number'.

実行結果

引数が数値と数値: 1,2
引数が文字列と文字列: a,b
--
引数が数値と数値: 1,2
引数が文字列と文字列: a,b
引数が真偽値と真偽値: true,false
引数が数値と文字列: 1,b
--
型推論を使い、型引数<~>を省略
引数が数値と数値: 1,2
引数が文字列と文字列: a,b
引数が真偽値と真偽値: true,false
引数が数値と文字列: 1,b
--
引数が数値と数値: 1,2
引数が文字列と文字列: a,b
引数が真偽値と真偽値: true,false

フィードバックお待ちしております!

 ご感想、解説してほしい用語、解説内容のアドバイスなどございましたら、FacebookX(旧Twitter)などでお気軽に編集部までお寄せください。よろしくお願いいたします。

この記事は参考になりましたか?

マンガで分かるプログラミング用語辞典連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/23686 2026/06/30 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング