中級のTypeScriptエラー 36問
12種類のエラーを、それぞれ複数パターンずつ収録しています。
- is possibly 'undefined' の原因と直し方interfaceで?を付けたオプショナルプロパティは、値が入っていない(undefined)可能性を型として保持します。narrowing(存在確認)をせずにメソッドやプロパティへアクセスすると、このエラーになります。
- union型(string | number)のメソッド呼び出しで型エラーになる理由string | numberのようなunion型の値に対して、片方の型にしか無いメソッド(toUpperCaseなど)を呼び出そうとすると、もう一方の型に無いことを理由にエラーになります。typeof等で型を絞り込む(narrowing)必要があります。
- incorrectly implements interface の原因と直し方クラスがimplementsで宣言したinterfaceのメンバー(メソッドやプロパティ)を実装し忘れたときに出るエラーです。interfaceは「このクラスが持つべき形」の契約であり、implementsはその契約を守る宣言です。
- 文字列リテラルをenum型の引数に渡すとエラーになる理由enumで定義した型は、見た目が近い文字列リテラルであっても別の型として扱われます。enumのメンバー名と同じ文字列を渡しても、enum型そのものの値でなければ代入・引数として受け付けられません。
- readonly配列にpushしようとするとdoes not exist on typeになる理由readonly number[]のように宣言した配列型には、push・pop・splice等の破壊的(要素を変更する)メソッドがそもそも型として存在しません。呼び出そうとした時点で「そのメソッドは無い」というエラーになります。
- abstractクラスを直接newした原因と直し方abstractを付けたクラスは、そのままnewでインスタンス化することができません。abstractクラスは「共通の骨組みだけを定義し、具体的な実装はサブクラスに任せる」ためのクラスです。
- ジェネリクスの型引数を明示すると戻り値の型チェックが効くfunction firstOf<T>(items: T[]): Tのようなジェネリック関数は、呼び出し時に指定した型引数(例: firstOf<number>)に応じて戻り値の型が決まります。その型と違う型の変数で受け取ろうとするとエラーになります。
- No overload matches this call の原因と直し方複数のシグネチャ(オーバーロード)を持つ関数を、どの組み合わせにも当てはまらない引数の型で呼び出したときに出るエラーです。エラーメッセージには、試したすべてのオーバーロードでの失敗理由が列挙されます。
- asによる型アサーションがコンパイラを騙して実行時エラーになるasはコンパイラに「この値はこの型として扱ってよい」と伝える構文で、実際の値を変換したり検証したりはしません。unknown型の値をasで別の型に見せかけると、実際の値がその型のメソッドを持たない場合に実行時エラーになります。
- switchで一部returnを書き忘れた原因と直し方union型の値をswitch文で分岐する関数で、一部のケースにしかreturnを書かないと、「関数がreturn文で終わっていない」というエラーになります。TypeScriptはunion型の全パターンをたどって、返し忘れがないかを検査します。
- タプル型は要素数も型として扱われる(余分な要素はエラーになる)[number, number]のようなタプル型は、要素の型だけでなく要素数も型情報の一部です。通常のnumber[]と違い、決められた数より多い(または少ない)要素を持つ配列は代入できません。
- インデックスシグネチャと矛盾する型のプロパティを宣言するとエラーになる[key: string]: numberのようなインデックスシグネチャを持つinterfaceでは、個別に宣言する具体的なプロパティも、インデックスシグネチャの型と互換性がなければ宣言できません。