is not assignable to type の原因と直し方
変数への代入・関数の戻り値・プロパティへの代入など、宣言した型と違う型の値を渡そうとしたときにtscが検出するエラーです。TypeScriptで最初に出会うエラーの1つです。
エラーメッセージの読み方
main.ts(4,7): error TS2322: Type 'string' is not assignable to type 'number'.
main.ts- ファイル名
4- 行番号
7- 列番号 — この位置でtscが検査に失敗しました
TS2322- エラーコード — 検索するとTypeScriptの解説が見つかります
Type 'string' is not assignable to type 'number'.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 function summarize(age: number): string { 2 return `age: ${age}`; 3 } 4 const age: number = "25"; ^ 5 console.log(summarize(age));
main.ts(4,7): error TS2322: Type 'string' is not assignable to type 'number'.
ageはnumber型として宣言されているため、文字列"25"は代入できません。数値リテラルの25を使う必要があります。
直し方: "25" を 25 にします。
広告
広告スロット(未設定)
パターン2
1 function square(n: number): number { 2 return n + "!"; ^ 3 } 4 console.log(square(4));
main.ts(2,3): error TS2322: Type 'string' is not assignable to type 'number'.
戻り値の型はnumberと宣言されています。n + "!"は文字列になるため、この関数の戻り値としては使えません。
直し方: n + "!" を n * n にします。
パターン3
1 interface Item { 2 price: number; 3 } 4 const item: Item = { price: "9.99" }; ^ 5 console.log(item.price);
main.ts(4,22): error TS2322: Type 'string' is not assignable to type 'number'.
Item.priceはnumber型なので、文字列の"9.99"は代入できません。数値の9.99を渡す必要があります。
直し方: "9.99" を 9.99 にします。
よくある誤解
「JavaScriptは動的型付けだから緩いはず」という感覚のままだと、これが構文エラーではなく型エラーだと気づきにくいことがあります。tscは実行前に型だけを見て機械的に判定しており、値の意味は考慮しません。
まとめ
is not assignable to typeは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。