【早見表】TypeScriptでよく使うESLintルール一覧

型安全とコード品質を両立させる近道は、ESLint ルールを適切に選択し継続運用することです。ここでは TypeScript プロジェクトで頻繁に利用される 35 ルールを、よく使う場面と合わせて整理いたしました。
導入目的
TypeScript でもケアレスミスは発生いたします。静的解析ツール ESLint と @typescript-eslint
プラグインを導入することで、型安全とスタイル統一を同時に実現できます。
導入例(Yarn):
bashyarn add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
yarn eslint --init
早見表一覧
# | ルール名 | 分類 | よく使う場面 | 概要 |
---|---|---|---|---|
1 | @typescript-eslint/no-unused-vars | バグ防止 | 新規 UI 実装で不要変数が散乱しがちなとき | 未使用変数・引数を検出 |
2 | @typescript-eslint/consistent-type-imports | スタイル | モノレポで JS 出力を軽量化したいとき | import type 統一 |
3 | @typescript-eslint/no-explicit-any | 型安全 | JS→TS 移行初期段階で any が氾濫 | any 濫用を警告 |
4 | @typescript-eslint/explicit-function-return-type | 型安全 | 公開 SDK で戻り値互換性を守るとき | 戻り値型を明示 |
5 | @typescript-eslint/strict-boolean-expressions | バグ防止 | API 実装で undefined 判定漏れが怖いとき | 真偽値以外の条件禁止 |
6 | @typescript-eslint/prefer-readonly | 設計 | Redux ストアなど不変データを扱うとき | readonly 推奨 |
7 | @typescript-eslint/member-ordering | スタイル | 大規模クラスで順序バラツキ解消 | メンバー並び順統一 |
8 | @typescript-eslint/consistent-indexed-object-style | スタイル | DTO を大量に定義するライブラリ開発 | Record かインデックスを統一 |
9 | @typescript-eslint/no-floating-promises | バグ防止 | 非同期 I/O が多いバックエンド | await 漏れ検出 |
10 | @typescript-eslint/prefer-nullish-coalescing | スタイル | API レスポンスの既定値設定 | ?? でデフォルト値 |
11 | @typescript-eslint/prefer-optional-chain | スタイル | ネストオブジェクト多用の UI 層 | ?. へ統一 |
12 | @typescript-eslint/consistent-type-definitions | スタイル | コードレビューで type と interface 混在対策 | どちらか統一 |
13 | @typescript-eslint/no-non-null-assertion | 型安全 | 他人のコードで ! 乱用が目立つとき | 非 null アサーション抑止 |
14 | @typescript-eslint/no-inferrable-types | スタイル | 初学者が冗長な型注釈を書きがちなとき | 推論可能型を省略 |
15 | @typescript-eslint/no-unnecessary-type-assertion | 型安全 | キャスト癖を持つプロジェクトで | 不要な as を警告 |
16 | @typescript-eslint/array-type | スタイル | 配列型表記を一本化したいモノレポ | T[] or Array<T> 統一 |
17 | @typescript-eslint/prefer-for-of | パフォーマンス | ループ最適化を優先する Node.js 処理 | for...of 推奨 |
18 | @typescript-eslint/no-misused-promises | バグ防止 | DOM/イベントで async ハンドラを使うとき | 誤用 Promise を検知 |
19 | @typescript-eslint/no-unsafe-assignment | 型安全 | 外部 JSON を直接扱うツール | 型不明値代入を警告 |
20 | @typescript-eslint/no-unsafe-member-access | 型安全 | 動的キーアクセスが多いとき | 不明型プロパティ禁止 |
21 | @typescript-eslint/no-unsafe-call | 型安全 | 任意スクリプト実行のプラグイン機構 | 不明型関数呼び出し禁止 |
22 | @typescript-eslint/promise-function-async | 型安全 | 内部ユーティリティを整理するとき | 非同期関数は async 必須 |
23 | @typescript-eslint/switch-exhaustiveness-check | 型安全 | Enum 状態遷移を網羅確認 | switch 漏れ防止 |
24 | @typescript-eslint/restrict-template-expressions | バグ防止 | 国際化メッセージで型安全確保 | テンプレ式安全化 |
25 | @typescript-eslint/no-duplicate-enum-values | バグ防止 | 既存 Enum を拡張するとき | 重複値禁止 |
26 | @typescript-eslint/no-extra-semi | スタイル | Prettier 非導入環境でセミ誤挿入防止 | 余計セミ削除 |
27 | @typescript-eslint/no-empty-interface | スタイル | DTO 生成ツール利用で空インタフェース発生 | 意味の無い空型禁止 |
28 | @typescript-eslint/default-param-last | スタイル | 可読性重視の関数 API 設計 | 既定値引数を末尾へ |
29 | @typescript-eslint/no-redundant-type-constituents | 型安全 | 巨大ユニオンを整理するとき | 重複ユニオン排除 |
30 | @typescript-eslint/prefer-reduce-type-parameter | パフォーマンス | 複合計算処理で reduce 多用 | 型パラメータ活用 |
31 | @typescript-eslint/consistent-generic-constructors | スタイル | ジェネリック new 演算子乱立 | 表記統一 |
32 | @typescript-eslint/no-unnecessary-condition | バグ防止 | 古い if ガードの整理 | 常時真偽条件を警告 |
33 | @typescript-eslint/no-extraneous-class | スタイル | ヘルパ関数だけの空クラス抑止 | 不要クラス禁止 |
34 | @typescript-eslint/return-await | バグ防止 | エラースタックが必要な API | return await 最適化 |
35 | @typescript-eslint/no-require-imports | スタイル | ES Modules へ全面移行 | require 禁止 |
TypeScript プロジェクトで“最も遭遇しやすい 35 ルール”について、よく使う場面・サンプルコード・詳しい解説をセットで並べました。各ルールをピンポイントで検索できるよう小見出しにルール ID をそのまま用いております。実務でコピペできるよう before / after 形式で示していますので、レビューやリファクタリングの際にご活用ください。
読み方のガイド
- 場面 … そのルールが真価を発揮する代表シチュエーション
- before / after … 違反例と修正例
- 解説 … 挙動・オプション・運用 Tips など
1 @typescript-eslint/no-unused-vars — 未使用変数削除
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | 新規 UI 実装で変数が残骸化しやすいとき |
ts// ❌ before
function greet(name: string, unused: string) {
console.log(`Hello ${name}`);
}
// ✅ after
function greet(name: string) {
console.log(`Hello ${name}`);
}
このルールは コンパイル時に削除されない“影だけの変数” を検出します。argsIgnorePattern
や varsIgnorePattern
オプションで _
プレフィックスを許可するなどプロジェクトポリシーに合わせて緩和できます。CI に --max-warnings 0
を組み込み「未使用ゼロ」を守る運用が効果的です。
2 @typescript-eslint/consistent-type-imports — 型専用インポート統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | モノレポで JS 出力を軽量化したいとき |
ts// ❌ before
import { User } from './types';
// ✅ after
import type { User } from './types';
import type
を強制することで、バンドル後の不要な import 文を削除し Tree-Shaking 効果を最大化します。prefer: "type-imports"
か "no-type-imports"
を選択できるため、既存コードに合わせ段階的移行も可能です。
3 @typescript-eslint/no-explicit-any — any 濫用抑止
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | JS→TS 移行初期で any が氾濫 |
ts// ❌ before
function parse(raw: any) {
return JSON.parse(raw);
}
// ✅ after
interface User { id: string; name: string; }
function parse(raw: string): User {
return JSON.parse(raw) as User;
}
any
は型安全の抜け穴です。違反箇所を eslint-ignore で一時的に白抜き → 型を付けて戻すワークフローが移行期の定番パターンです。ignoreRestArgs
で可変引数だけ緩和するなど、警告フラッドを防ぎながら導入できます。
4 @typescript-eslint/explicit-function-return-type — 戻り値型明示
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | 公開 SDK で API 変更を防ぎたいとき |
ts// ❌ before
export const sum = (a: number, b: number) => a + b;
// ✅ after
export const sum = (a: number, b: number): number => a + b;
暗黙推論に頼らず戻り値型を固定することで 破壊的変更をコンパイラが検知 します。allowExpressions: true
にすると式ベースの関数を許可でき、テストコードで煩雑になりがちな return 型注釈を省略可能です。
5 @typescript-eslint/strict-boolean-expressions — 真偽値判定厳格化
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | API 実装で undefined 判定漏れが怖いとき |
ts// ❌ before
if (user.id) { /* string でも 0 でも truthy */ }
// ✅ after
if (user.id !== undefined && user.id !== null) { /* 厳密 */ }
不確定値を条件式に渡すと “隠れ falsy” バグが発生します。allowString
, allowNumber
などの細分化オプションで 段階的に厳しさを上げる と導入がスムーズです。
6 @typescript-eslint/prefer-readonly — 不変変数推奨
属性 | 説明 |
---|---|
分類 | 設計 |
場面 | Redux ストアやコンテキストで不変データを扱うとき |
ts// ❌ before
interface Todo { id: string; text: string; }
let todo: Todo = { id: '1', text: 'draft' };
todo.id = '2';
// ✅ after
interface Todo { readonly id: string; text: string; }
const todo: Todo = { id: '1', text: 'draft' }; // 再代入不可
副作用を排除することで タイムトラベルデバッグやメモ化 が機能しやすくなります。onlyInlineLambdas: true
で短命オブジェクトを除外可能です。
7 @typescript-eslint/member-ordering — クラス順序統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | 大規模クラスで可読性を保ちたいとき |
tsclass UserService {
// ❌ バラバラ
get name(): string { … }
private cache = new Map();
constructor(private repo: Repo) {}
static version = '1.0';
}
推奨順に並べ替えると…
tsclass UserService {
static version = '1.0'; // public-static-field
private cache = new Map(); // private-instance-field
constructor(private repo: Repo) {} // constructor
get name(): string { … } // public-instance-getter
}
読み慣れたレイアウト が保たれレビュー効率が向上します。順序は独自プリセットを JSON 配列で自由に定義できます。
8 @typescript-eslint/consistent-indexed-object-style — Record 統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | DTO を大量生成するツールチェーン |
ts// ❌ before
type Dict = { [key: string]: number };
// ✅ after
type Dict = Record<string, number>;
スタイル統一で 各種コード生成器との互換性も向上 します。"index-signature"
を指定すれば逆にインデックスシグニチャへ統一も可能です。
9 @typescript-eslint/no-floating-promises — await 漏れ検出
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | 非同期 I/O が多いバックエンド |
ts// ❌ before
fetchUser(); // 戻り値の Promise が無視され例外が握りつぶされる
// ✅ after
await fetchUser(); // 例外は呼び出し元へ伝搬
// あるいは
void fetchUser(); // 戻り値を意図的に無視
void
キャストを使うことで 「無視は意図的」 であると静的に宣言できます。オプション ignoreIIFE: true
で即時呼び出し関数を除外可能です。
10 @typescript-eslint/prefer-nullish-coalescing — Null 合体演算子推奨
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | API レスポンスの既定値設定 |
ts// ❌ before
const title = data.title || 'Untitled'; // 空文字も Untitled になる
// ✅ after
const title = data.title ?? 'Untitled'; // null/undefined だけを補完
??
を使うと 空文字・0 などの有効値を保持 できます。ignoreConditionalTests
でテスト系演算子を緩和可能です。
11 @typescript-eslint/prefer-optional-chain — オプショナルチェーン推奨
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | ネストデータを多用する UI 層 |
ts// ❌ before
const city = user && user.address && user.address.city;
// ✅ after
const city = user?.address?.city;
可読性向上に直結します。Babel 変換が不要な ES2020 以降ターゲットで特に有効です。
12 @typescript-eslint/consistent-type-definitions — type / interface 統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | コードレビューで表記バラツキが目立つとき |
ts// "type" 派の場合
{
"@typescript-eslint/consistent-type-definitions": ["error", "type"]
}
全ファイル同一表記となり 差分レビューが見やすく なります。
13 @typescript-eslint/no-non-null-assertion — 非 null アサーション抑止
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | フォーム値など optional プロパティが多いとき |
ts// ❌ before
submit(user!.id); // 落ちるかもしれない
// ✅ after
if (user) submit(user.id);
!
は “最後の手段” に限定することで 実行時例外を激減 させます。
14 @typescript-eslint/no-inferrable-types — 冗長型注釈排除
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | 初学者コードで明らかに推論できる型注釈が多いとき |
ts// ❌ before
const count: number = 0;
// ✅ after
const count = 0;
型推論を信用し コードを短く保つ ルールです。ignoreParameters
などで柔軟に調整できます。
15 @typescript-eslint/no-unnecessary-type-assertion — 不要キャスト警告
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | “念のため as” が常態化しているプロジェクト |
ts// ❌ before
const name = (value as string).trim();
// ✅ after
const name = value.trim();
余計な as
を排除し キャストの本当の必要箇所を浮き彫り にします。
16 @typescript-eslint/array-type — 配列表記統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | モノレポで複数チームが混在 |
jsonc{ "@typescript-eslint/array-type": ["error", { "default": "array-simple" }] }
T[]
に統一すると 読みやすさと入力コストが両立 します。
17 @typescript-eslint/prefer-for-of — for-of 推奨
属性 | 説明 |
---|---|
分類 | パフォーマンス |
場面 | Node.js CPU バウンド処理で微細最適化 |
ts// ❌ before
for (const key in list) { /* hasOwnProperty を忘れがち */ }
// ✅ after
for (const item of list) { /* 安全かつ高速 */ }
for...in
の プロトタイプ汚染リスク も回避できます。
18 @typescript-eslint/no-misused-promises — Promise 誤用検知
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | DOM/イベントで async ハンドラを登録するとき |
ts// ❌ before
button.addEventListener('click', async () => await save());
// ✅ after
button.addEventListener('click', () => { void save(); });
イベントハンドラが返す Promise はブラウザが無視するため 握りつぶしを明示 します。
19 @typescript-eslint/no-unsafe-assignment — 型不明代入禁止
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | 外部 JSON をパースして内部で利用 |
tsconst raw = JSON.parse(input); // any
// ❌ 次行で警告
const id: string = raw.id; // 不安全
型ガードやスキーマ検証 (zod.parse
) を挟むことで 安全に内部型へ昇格 できます。
20 @typescript-eslint/no-unsafe-member-access — 不明型プロパティ禁止
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | プラグインで外部オブジェクトを扱うとき |
ts// ❌ before
const version = plugin.meta.version;
// ✅ after
if ('meta' in plugin && typeof plugin.meta === 'object') {
const version = (plugin.meta as { version: string }).version;
}
ランタイムチェックを伴う安全アクセス を強制できます。
21 @typescript-eslint/no-unsafe-call — 不明型呼び出し禁止
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | DI コンテナから動的取得した関数を呼ぶとき |
ts// ❌ before
handler(req); // any 型
// ✅ after
const safe = handler as (r: Request) => Response;
safe(req);
インターフェース境界を明示 して可読性を保ちます。
22 @typescript-eslint/promise-function-async — async 宣言必須
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | コールバック API を Promise 化するとき |
ts// ❌ before
function save(): Promise<void> { … }
// ✅ after
async function save(): Promise<void> { … }
async を付けることで 暗黙のラップが回避 されスタックトレースが分かりやすくなります。
23 @typescript-eslint/switch-exhaustiveness-check — 列挙型網羅
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | 状態遷移ロジックを switch で実装 |
tsenum Status { Idle, Loading, Success, Error }
function label(s: Status) {
switch (s) {
case Status.Idle:
case Status.Loading:
case Status.Success:
return s;
default:
const _exhaustive: never = s; // ❌ Error が漏れていれば TSC も赤線
return _exhaustive;
}
}
TSC と ESLint の二重チェック で漏れをゼロにできます。
24 @typescript-eslint/restrict-template-expressions — テンプレ式安全化
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | 国際化メッセージで数値・日付を統一フォーマット |
ts// ❌ before
const msg = `Score: ${score}`; // score が number でも警告
// ✅ after
const msg = `Score: ${String(score)}`;
暗黙 toString()
が暴走して ロケール依存の差異 を防げます。
25 @typescript-eslint/no-duplicate-enum-values — Enum 重複禁止
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | 既存 Enum を改修する大型 PR |
tsenum Role { Admin = 1, Owner = 1 } // ❌ Duplicate
CI 段階で 早期に衝突を検出 できます。
26 @typescript-eslint/no-extra-semi — 余分セミコロン排除
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | Prettier 未導入リポジトリ |
tsconst a = 1;; // ❌ 二重セミ
プリプロセッサを介さない環境でも コードフォーマットを一定に 保てます。
27 @typescript-eslint/no-empty-interface — 空インタフェース禁止
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | 自動生成 DTO に空型が混入 |
tsinterface Empty {} // ❌
type Empty = Record<string, never>; // ✅ 目的が明確
意図が曖昧な型 を排除しリーダビリティを高めます。
28 @typescript-eslint/default-param-last — 既定値引数は末尾
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | 関数 API をデザインするとき |
ts// ❌ before
function range(end = 10, start = 0) { … }
// ✅ after
function range(start: number, end = 10) { … }
型推論と呼び出し側の 可読性が両立 します。
29 @typescript-eslint/no-redundant-type-constituents — 重複ユニオン排除
属性 | 説明 |
---|---|
分類 | 型安全 |
場面 | 巨大ユニオン型を手動編集 |
tstype A = string | string | number; // ❌
type A = string | number; // ✅
ユニオン縮約で IDE 補完も高速化 します。
30 @typescript-eslint/prefer-reduce-type-parameter — reduce 型パラメータ推奨
属性 | 説明 |
---|---|
分類 | パフォーマンス |
場面 | 複雑な Accumulator 型を伴う reduce |
ts// ❌ before
list.reduce((sum, n) => sum + n, 0);
// ✅ after
list.reduce<number>((sum, n) => sum + n, 0);
型パラメータ指定で 初期値と戻り値の型不一致 を防ぎます。
31 @typescript-eslint/consistent-generic-constructors — ジェネリック new 統一
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | new Map<K,V>() と Map<K,V>() が混在 |
ts// "constructor" を採用
const ids = new Set<string>();
全ファイル同表記 で差分が縮小します。
32 @typescript-eslint/no-unnecessary-condition — 余分条件警告
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | レガシーコードで古い if ガードが残存 |
tsfunction always(id: string) {
if (id) { // ❌ 文字列は常に truthy
return id;
}
return '';
}
デッドコードを早期発見 できリファクタリング効率が上がります。
33 @typescript-eslint/no-extraneous-class — 不要ラッパークラス禁止
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | 静的メソッドしか持たないユーティリティ |
ts// ❌ before
class MathUtil {
static sum(a: number, b: number) { … }
}
// ✅ after
export const sum = (a: number, b: number) => …;
関数化で ツリーシェイク効果とテスト容易性 が向上します。
34 @typescript-eslint/return-await — return await 最適化
属性 | 説明 |
---|---|
分類 | バグ防止 |
場面 | スタックトレースが必要なエラーハンドラ |
ts// ❌ before
return fetchUser(); // 呼び出し元にスタックが紛れる
// ✅ after
return await fetchUser(); // 現在の関数がトレースに残る
try/catch
と組み合わせる際に デバッグ効率を確保 できます。
35 @typescript-eslint/no-require-imports — require 禁止
属性 | 説明 |
---|---|
分類 | スタイル |
場面 | ES Modules へ全面移行中 |
ts// ❌ before
const fs = require('fs');
// ✅ after
import fs from 'fs';
CommonJS を撲滅して バンドラー最適化や Top-Level Await を活用できます。
まとめ
今回よく使うESLintのルールを35個まとめました。 運用の視点として、 ルールは「型安全」「バグ防止」「スタイル統一」「設計支援」「パフォーマンス最適化」の5個の軸で優先順位を付けると、選択が容易になります。
そしてまずは バグ防止系と型安全系 を CI で必須設定し、--fix
を通して自動修正の文化を作ることを目指しましょう。
次にプロジェクトの規模やメンバー構成を踏まえてスタイル系ルールを拡充し、コードレビューでの認知負荷を軽減いたします。
設計支援系・パフォーマンス系は導入効果と警告ノイズのバランスを見ながら段階的に厳格化すると、移行ストレスを最小限に抑えられます。
すべてのルールに共通する運用ポイントは、「違反ゼロの状態を維持できるルールセットだけを常時オンにする」 ことです。
運用しきれないルールを惰性で残すと警告で埋もれて効果が薄れるため、定期的なルール棚卸しと eslint --print-config
を用いた設定の可視化を習慣化していきましょう。
最終的には CI とエディタプラグインの二段構え で即時フィードバックを得られる環境を整備し、型安全・品質・開発体験を同時に底上げできる継続的インテグレーション体制を完成させてください。
関連リンク
TypeScriptの記事Typescript
- article
どっちを使うべき?TypeScriptのtype(型エイリアス)とinterfaceの違いと使い分け
- article
TypeScript 5.8 で強化された型推論!その裏で潜む 落とし穴と回避策
- article
【早見表】TypeScript Generics(ジェネリクス)の使用例と記法まとめ
- article
【2025年5月版 早見表】TypeScript 5.7 tsconfig.jsonの主要オプションのまとめ
- article
VSCodeで開発時のインポート補完(TypeScript)を相対パスからエイリアスにする設定
- article
【解決策】TypeScriptで発生するTS2564エラーの対応
- article
どっちを使うべき?TypeScriptのtype(型エイリアス)とinterfaceの違いと使い分け
- article
TypeScript 5.8 で強化された型推論!その裏で潜む 落とし穴と回避策
- article
【早見表】TypeScript Generics(ジェネリクス)の使用例と記法まとめ
- article
開発AIエディタ比較 Github Copilot vs Cursor vs Cline vs devin!それぞれの特徴や料金の違いを比較してみた
- article
【2025年5月版 早見表】TypeScript 5.7 tsconfig.jsonの主要オプションのまとめ
- article
【対処法】Cursorで発生する「Connection failed. If the problem persists ...」エラーの原因と対応