Code Fix

初級

未定義プロパティを書いたエラーの原因と直し方

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入門" } にします。

この問題を解いてみる →

パターン4

 1  interface Tag {
 2    name: string;
 3  }
 4  const t: Tag = { name: "x", color: "red" };
                                ^
 5  console.log(t.name);
main.ts(4,29): error TS2353: Object literal may only specify known properties, and 'color' does not exist in type 'Tag'.

Tagにcolorというプロパティはありません。余分なプロパティはリテラルに書けません。

直し方: { name: "x", color: "red" } を { name: "x" } にします。

この問題を解いてみる →

パターン5

 1  interface Note {
 2    text: string;
 3  }
 4  const n: Note = { text: "hi", pinned: true };
                                  ^
 5  console.log(n.text);
main.ts(4,31): error TS2353: Object literal may only specify known properties, and 'pinned' does not exist in type 'Note'.

Noteにpinnedというプロパティは定義されていません。

直し方: { text: "hi", pinned: true } を { text: "hi" } にします。

この問題を解いてみる →

よくある誤解

「余分なプロパティがあっても、使わなければ問題ないはず」という感覚は、オブジェクトリテラルを直接代入する場面では通用しません。TypeScriptはリテラルに対してだけ、余分なプロパティが無いかを厳格にチェックします。

実務での勘所

この検査(超過プロパティチェック)が無ければ、プロパティ名のタイプミスの多くが構造的型付けの構造上、正常なコードとして通ってしまいます。純粋な構造的型付けでは「必要なプロパティが揃っていて型が合っていればよい」と判定するため、必須プロパティをすべて満たしたうえでnameをnmaeと打ち間違えた余分なプロパティを追加しても、本来の構造的型付けのルールだけでは合格してしまいます。TypeScriptはこの種のタイプミスを実務でよく見られる典型的な事故と判断し、オブジェクトリテラルを直接渡す場面に限って例外を設けています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)