TypeScriptで配列の変数を定義しようとしたとき、「number[] と $Array<number>$ は何が違うの?」「string しか入らない配列はどう書くの?」と疑問に思ったことはありませんか?
この記事では、TypeScriptにおける配列の型注釈の基本ルールを、実例を交えて解説しています。
number[]やstring[]とは何か?
TypeScript(TS)の number[] や string[] は、配列の型注釈です。
具体的には、配列の型を指定するもので、その配列が特定の型の要素のみを含むことを示します。
JavaScriptの配列の型はArray型(配列型)しか存在しません。これをより厳密に定義したものになります。
基本形は2つ
配列の型注釈の基本形は以下の2つがあります。
- 型名 + 各括弧[] 形式
- ジェネリック 形式
型名 + 各括弧[] 形式
型名 + 各括弧[] 形式は、最も一般的で推奨される形式です。
配列を表す[ ]の前に型をつけることで、その配列の中身が指定した型しかとらないことを定義します。
要素の型[]例えば以下のような種類があります。
number[]:数値の配列string[]:文字列の配列boolean[]:真偽値の配列User[]:カスタム型の配列 (*Userは自分で定義した型)
ジェネリック形式:Array<T>
型名 + 各括弧[] 形式をジェネリック形式でも記述することができます。
ジェネリック型 Array を使い、その要素の型を型引数として指定します。
Array<要素の型>
例えば以下のような種類があります。
Array<number>:数値の配列(number[]と同じ)Array<string>:文字列の配列(string[]と同じ)
配列の型をジェネリック形式で指定することはほとんどありません。基本的に、型名 + 各括弧[] 形式を使います。
実例1:変数の型定義
配列の変数の型を定義する場合は以下のように記述します。
let numbers: number[] = [1, 5, 10, 3.14];
let names: string[] = ["Alice", "Bob", "Charlie"];なお、以下のように指定した型に一致しない要素が含まれる場合はエラーになります。
let numbers: number[] = [1, "five", 10]; //コンパイルエラー型推論を使う
配列の変数などの型を定義するときに、あえて「型名 + 各括弧形式」のように型を指定せず型推論に任せるのが一般的です。
let numbers = [1, 5, 10, 3.14]; //型推論でnumber[]になる。
let names = ["Alice", "Bob", "Charlie"]; //: //型推論でstring[]になる。型推論はTypeScriptにおいて非常に重要でよく使う機能です。型推論とは何かについては下記をご参考ください。
実例2:配列の中に複数の型を含む場合
配列の中に複数の型を含む場合は、ユニオン型を使います。
例えば、以下のように記述すれば、配列の中身は文字列、数値、真偽値のいずれかを許容できます。
(string | number | boolean)[]▼具体的な使い方
let mixedArray: (string | number | boolean)[] = [
"Hello", // string
123, // number
true // boolean
];TS独自の型一覧
配列の型のように、JavaScriptにはなく、TypeScriptにしか存在しない型は他にもあります。
れらは主にコンパイル時の型チェックのために存在し、JavaScriptの実行時には消滅したり、特定の機能に置き換えられたりする型です。
| 型の種類 | 説明 | 例 |
any | あらゆる型を受け入れます。型チェックを無効化する際に使用されますが、型安全性が失われるため、なるべく避けるべきです。 | let value: any = 5; |
unknown | あらゆる値を受け入れますが、anyとは異なり、使用する前に型を絞り込む(型アサーションや型ガードを行う)必要があります。より安全なanyと言えます。 | let value: unknown; |
void | 値を持たないことを表します。主に何も返さない関数の戻り値の型として使用されます。 | function log(): void { console.log('Hi'); } |
never | 決して発生しない値の型です。例えば、無限ループや常に例外をスローする関数の戻り値の型に使用されます。網羅性チェックにも役立ちます。 | function fail(): never { throw new Error('Error'); } |
enum (列挙型) | 定数のセットに名前を付けることができます。可読性が向上します。 | enum Color { Red, Green, Blue } |
tuple (タプル) | 要素の数とそれぞれの型が固定された配列を表します。異なる型の値を順序付きのリストとして保持できます。 | let xy: [number, number] = [10, 20]; |
複雑な構造を表現するための概念
他にも、JavaScriptにはなく、TypeScriptにしか存在しない型の概念もあります。
| 概念 | 説明 | 例 |
Interface (インターフェース) | オブジェクトの構造(プロパティやメソッド)を定義し、その実装を保証するための型です。クラスの実装や、オブジェクトの型付けによく使われます。 | interface Point { x: number; y: number; } |
Type Alias (型エイリアス) | 任意の型の組み合わせに別名を付けます。既存の型に新しい名前を付けたり、ユニオン型や交差型などの複雑な型を定義するのに便利です。 | type ID = string | number; |
Union Type (共用型) | 複数の型のうちのいずれかであることを表します。` | ` (パイプ)記号で型を結合します。 |
Intersection Type (交差型) | 複数の型をすべて兼ね備えていることを表します。& (アンパサンド)記号で型を結合します。 | type FullPoint = Point & { z: number; }; |
Literal Type (リテラル型) | 特定の値そのものを型として定義します。例えば、'success'という文字列だけを許容する型などです。 | type Status = 'success' | 'error'; |
Generics (ジェネリクス) | 型を引数として受け取ることで、再利用可能なコンポーネント(関数やクラス)を作成できます。特定の型に依存せず、柔軟な設計を可能にします。 | function identity<T>(arg: T): T { return arg; } |
Mapped Types | 既存の型に基づいて新しい型を作成する仕組みです。例: 型のすべてのプロパティを読み取り専用にしたり、オプショナルにしたりできます。 | type Readonly<T> = { readonly [P in keyof T]: T[P]; }; |
Conditional Types | 条件に基づいて型を選択する高度な仕組みです。ジェネリクスと組み合わせて、複雑な型操作を行います。 | type IsString<T> = T extends string ? true : false; |

