What is "not assignable to parameter of type never" error in TypeScript の原因と直し方【Dockerで検証済み】
What is "not assignable to parameter of type never" error in TypeScript? の原因と解決方法。検証済みの解決コマンド付きで、現象→原因→解決→確認の順に最短で直せます。
発生したエラー
What is "not assignable to parameter of type never" error in TypeScript?結論:まずこれで直ります
下の解決コマンドを順に実行すれば直ります。
cat > /tmp/never_error_fixed.ts << 'EOF'
const arr: string[] = [];
arr.push("hello");
const arr2: Array<string | number> = [];
arr2.push("world");
arr2.push(42);
function example(value: string | number) {
if (typeof value === 'string') {
const strArr: string[] = [];
strArr.push(value);
} else {
const numArr: number[] = [];
numArr.push(value);
}
}
EOF現象どんなエラーか
次の操作を行うと(検証環境: node:20)、上記のエラーが発生します。まずは下の再現コマンドで、同じ状況を再現できることを確認してください。
検証環境:node:20
cd /tmp && npm init -y > /dev/null 2>&1 && npm install typescript > /dev/null 2>&1
cat > /tmp/never_error.ts << 'EOF'
const arr: never[] = [];
arr.push("hello");
EOF
./node_modules/.bin/tsc --strict --noEmit /tmp/never_error.ts 2>&1原因なぜ起きるのか
TypeScript で 'not assignable to parameter of type never' エラーが発生する主な原因は、変数や配列の型が `never` と推論されてしまうことです。 代表的なケースは次の通りです。 1. **空配列リテラルの型推論**: `const arr: never[] = []` と明示的に `never[]` を書いたり、strict モードで `const arr = []` と書くと TypeScript が要素の型を決定できず `never[]` と推論します。その配列に値を追加しようとすると、`never` 型には何も代入できないためエラーになります。 2. **絞り込み(narrowing)後の残余ブランチ**: `if/else` や `switch` ですべての型バリアントを処理し終えた後に残るブランチでは、型が `never` になります。そこに値を渡そうとするとエラーになります。 **修正方法**: 配列や変数には必ず具体的な型アノテーションを付けること(例: `const arr: string[] = []` や `const arr: Array<string | number> = []`)が基本的な解決策です。根本的には `never` は「この型には何も当てはまらない・到達不能」というTypeScriptのサインなので、型定義を見直して正しい型を明示することが解決の本質です。 今回の再現失敗の原因は `npx tsc` が npm レジストリから古い非公式の `tsc` パッケージを誤って取得してしまったためです。修正版では `npm install typescript` で本物の TypeScript コンパイラをインストールし、`./node_modules/.bin/tsc` を直接呼び出すようにしました。
解決解決手順
cat > /tmp/never_error_fixed.ts << 'EOF'
const arr: string[] = [];
arr.push("hello");
const arr2: Array<string | number> = [];
arr2.push("world");
arr2.push(42);
function example(value: string | number) {
if (typeof value === 'string') {
const strArr: string[] = [];
strArr.push(value);
} else {
const numArr: number[] = [];
numArr.push(value);
}
}
EOF確認直ったか確認する
cd /tmp && ./node_modules/.bin/tsc --strict --noEmit /tmp/never_error_fixed.ts 2>&1 && echo 'Type check passed' && exit 0 || exit 1動画で見る
この記事の解決手順は実環境で検証しています
山田 英紀(社内SE 5年以上・13業種以上の業務システムを開発/運用)が、 掲載コマンドを検証環境で実行し、再現〜解決〜確認まで通ることを確認しています。