未定義プロパティを書いたエラーの原因と直し方
interfaceに定義されていないプロパティを、オブジェクトリテラルに書いてしまったときに出るエラーです。プロパティ名のタイプミスもこの形で検出されます。
エラーメッセージの読み方
main.ts(5,40): error TS2353: Object literal may only specify known properties, and 'adress' does not exist in type 'User'.
main.ts- ファイル名
5- 行番号
40- 列番号 — この位置でtscが検査に失敗しました
TS2353- エラーコード — 検索するとTypeScriptの解説が見つかります
Object literal may only specify known properties, and 'adress' does not exist in type 'User'.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 interface User { 2 name: string; 3 age: number; 4 } 5 const u: User = { name: "Al", age: 30, adress: "Tokyo" }; ^ 6 console.log(u.name);
main.ts(5,40): error TS2353: Object literal may only specify known properties, and 'adress' does not exist in type 'User'.
Userにadressというプロパティはありません(addressのタイプミスです)。定義されていないプロパティはリテラルに書けません。
直し方: { name: "Al", age: 30, adress: "Tokyo" } を { name: "Al", age: 30 } にします。
広告
広告スロット(未設定)
パターン2
1 interface Config { 2 host: string; 3 } 4 const c: Config = { host: "localhost", port: 8080 }; ^ 5 console.log(c.host);
main.ts(4,40): error TS2353: Object literal may only specify known properties, and 'port' does not exist in type 'Config'.
Configにportというプロパティは定義されていません。余分なプロパティをリテラルに含めるとエラーになります。
直し方: { host: "localhost", port: 8080 } を { host: "localhost" } にします。
パターン3
1 interface Book { 2 title: string; 3 } 4 const b: Book = { title: "TS入門", pages: 200 }; ^ 5 console.log(b.title);
main.ts(4,34): error TS2353: Object literal may only specify known properties, and 'pages' does not exist in type 'Book'.
Bookにはpagesというプロパティはありません。titleだけを持つ型として宣言されています。
直し方: { title: "TS入門", pages: 200 } を { title: "TS入門" } にします。
よくある誤解
「余分なプロパティがあっても、使わなければ問題ないはず」という感覚は、オブジェクトリテラルを直接代入する場面では通用しません。TypeScriptはリテラルに対してだけ、余分なプロパティが無いかを厳格にチェックします。
まとめ
未定義プロパティを書いたエラーの原因と直し方は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。