エラーの内容
Generic type 'Array<T>' requires 1 type argument(s). ts(2314)
このエラーは、Array、Promise、Map、Set、またはカスタムのジェネリック型を、保持する型を指定せずに参照した際に発生します。TypeScript は推論できないコードをコンパイルできません。
発生原因
すべてのジェネリック型は少なくとも1つの型パラメータを持ちます。Array<T> の T がそれです。これを省略すると、TypeScript は配列が実際に何を含んでいるかを推測しなければならなくなります。しかし TypeScript は推測を行わず、代わりにエラーを出力します。
よくある原因:
- 型の位置に型引数なしのジェネリックを記述する:
let items: Array - 組み込みのジェネリック(
Promise、Map、Set、Record)を型引数なしで使用する - カスタムのジェネリッククラスやインターフェースを型パラメータなしで参照する
- Java や C# のコードをコピーペーストする — それらでは生の型が有効でも、TypeScript では無効です
段階的な修正方法
1. 組み込みのジェネリック:常に型引数を指定する
ここから始めましょう。ts(2314) の最も一般的な原因です。角括弧内に具体的な型を追加します:
// ❌ 誤り
let items: Array;
let pending: Promise;
let lookup: Map;
let ids: Set;
// ✅ 修正後
let items: Array<string>; // または: string[]
let pending: Promise<void>; // または: Promise<User>、Promise<number> など
let lookup: Map<string, number>;
let ids: Set<number>;
2. 関数のパラメータと戻り値の型
関数のシグネチャにも型引数が必要です。例外はありません:
// ❌ 誤り
function processItems(items: Array): void {}
async function fetchUser(): Promise {}
// ✅ 修正後
function processItems(items: Array<string>): void {}
async function fetchUser(): Promise<User> {}
3. カスタムのジェネリック型
独自のジェネリックインターフェースを作成しましたか?型アノテーションとして使用する箇所では、必ず型パラメータを指定してください:
interface Repository<T> {
findById(id: number): T;
save(entity: T): void;
}
// ❌ 誤り
const userRepo: Repository;
// ✅ 修正後
const userRepo: Repository<User>;
4. 型エイリアスとジェネリック
type ApiResponse<T> = {
data: T;
status: number;
message: string;
};
// ❌ 誤り
function handleResponse(res: ApiResponse) {}
// ✅ 修正後
function handleResponse(res: ApiResponse<unknown>) {}
// または具体的に:
function handleResponse(res: ApiResponse<User[]>) {}
5. 型が不明な場合:unknown または型パラメータを使用する
any を使いたくなりますが、それは型チェックを完全に無効にします。代わりに関数をジェネリックにして、呼び出し元が型を指定できるようにしましょう:
// ❌ 非推奨 — 型チェックが無効になる
function wrap(value: any): Array<any> { return [value]; }
// ✅ より良い方法 — 型が引き継がれる
function wrap<T>(value: T): Array<T> { return [value]; }
// TypeScript が各呼び出し箇所で正しい型を推論する
const nums = wrap(42); // number[]
const strs = wrap('hello'); // string[]
6. より厳格な設定:noImplicitAny
tsconfig.json で strict または noImplicitAny を有効にすると、突然多数のファイルで ts(2314) が表示されることがあります。これは想定通りの動作です。strict モードは以前は無視されていた生のジェネリックを表面化させます。それぞれを個別に修正してください。エラーを黙らせるためだけに設定を緩めてはいけません。
// tsconfig.json
{
"compilerOptions": {
"strict": true // noImplicitAny とその他の安全フラグを有効にする
}
}
修正の確認
TypeScript コンパイラをエミットなしモードで実行します:
npx tsc --noEmit
クリーンな終了(出力なし、終了コード 0)であれば完了です。VS Code では Ctrl+Shift+M で問題パネルを開くと、ファイルを保存した直後に ts(2314) のエントリが消えます。
クイックリファレンス
Array<T>→Array<string>、string[]、Array<unknown>Promise<T>→ 戻り値なしの場合はPromise<void>、それ以外はPromise<YourType>Map<K, V>→ 2つの引数が必要:Map<string, number>Set<T>→ 1つの引数:Set<string>- カスタムのジェネリック → 定義内の型パラメータの数に合わせる
- 不明なコンテンツ →
anyよりunknownを優先し、呼び出し元が型を絞り込めるようにする

