TypeScript オブジェクトリテラルの型定義:オプションプロパティ、readonlyプロパティ、その他の方法
TypeScript オブジェクトリテラルの型定義
オブジェクトリテラルは、JavaScript や TypeScript でオブジェクトを作成する方法の一つです。プロパティと値のセットを記述することで、簡単にオブジェクトを定義することができます。
const person = {
name: "John Doe",
age: 30,
isAdult: true,
};
上記の例では、person
というオブジェクトリテラルが定義されています。このオブジェクトには、name
、age
、isAdult
というプロパティがあり、それぞれ "John Doe"、30、true という値が割り当てられています。
型定義のメリット
オブジェクトリテラルに型定義を行うことで、以下のメリットを得ることができます。
- コードの安全性: プロパティ名や型の誤りをコンパイルエラーで検知できるため、コードの安全性を向上させることができます。
- 可読性の向上: オブジェクトの構造を明確に記述することで、コードの可読性を向上させることができます。
- コード補完機能の向上: 型定義を行うことで、開発環境のコード補完機能がより正確に動作するようになります。
型定義の方法
オブジェクトリテラルの型定義には、以下の方法があります。
インターフェースは、オブジェクトの構造を定義するための型です。オブジェクトリテラルがインターフェースを満たしていることを確認することで、型定義を行うことができます。
interface Person {
name: string;
age: number;
isAdult: boolean;
}
const person: Person = {
name: "John Doe",
age: 30,
isAdult: true,
};
型エイリアスは、既存の型に別名を与えるための型です。オブジェクトリテラルの型定義に型エイリアスを使うことで、コードをより簡潔に記述することができます。
type Person = {
name: string;
age: number;
isAdult: boolean;
};
const person: Person = {
name: "John Doe",
age: 30,
isAdult: true,
};
上記の例では、Person
という型エイリアスが定義されています。この型エイリアスは、name
、age
、isAdult
というプロパティを持つオブジェクトを表しています。
インデックスシグネチャは、オブジェクトのプロパティ名と型の関係を定義するための構文です。オブジェクトリテラルにインデックスシグネチャを使うことで、動的にプロパティを追加できるオブジェクトを定義することができます。
const person: { [key: string]: string } = {
name: "John Doe",
age: "30",
};
上記の例では、person
というオブジェクトリテラルが定義されています。このオブジェクトリテラルは、string
型のプロパティをいくつでも持つことができます。
TypeScript でオブジェクトリテラルの型定義を行うことで、コードの安全性と可読性を向上させることができます。インターフェース、型エイリアス、インデックスシグネチャなどの方法を使い分けて、状況に応じて適切な型定義を行いましょう。
インターフェースを使う
interface Person {
name: string;
age: number;
isAdult: boolean;
}
const person: Person = {
name: "John Doe",
age: 30,
isAdult: true,
};
// 以下のコードはエラーになる
// person.age = "30"; // Type 'string' is not assignable to type 'number'.
型エイリアスを使う
type Person = {
name: string;
age: number;
isAdult: boolean;
};
const person: Person = {
name: "John Doe",
age: 30,
isAdult: true,
};
// 以下のコードはエラーになる
// person.age = "30"; // Type 'string' is not assignable to type 'number'.
インデックスシグネチャを使う
const person: { [key: string]: string } = {
name: "John Doe",
age: "30",
};
// 以下のコードはエラーにならない
person.address = "123 Main Street";
// 以下のコードはエラーになる
// person.age = 30; // Type 'number' is not assignable to type 'string'.
オプションプロパティ
interface Person {
name: string;
age?: number; // オプションプロパティ
isAdult: boolean;
}
const person: Person = {
name: "John Doe",
isAdult: true,
};
// 以下のコードはエラーにならない
// person.age = undefined;
readonly プロパティ
interface Person {
readonly name: string;
age: number;
isAdult: boolean;
}
const person: Person = {
name: "John Doe",
age: 30,
isAdult: true,
};
// 以下のコードはエラーになる
// person.name = "Jane Doe"; // Cannot assign to 'name' because it is a read-only property.
- オブジェクトリテラルの型定義は、コードの規模や複雑さに応じて必要に応じて行うようにしましょう。
- 型定義を行うことで、コードの安全性と可読性を向上させることができますが、コードの読み書きが複雑になる場合もあります。
- 状況に応じて適切な型定義を行うようにしましょう。
オブジェクトリテラルの型定義のその他の方法
as
キーワードを使うことで、オブジェクトリテラルに型情報を付与することができます。
const person = {
name: "John Doe",
age: 30,
isAdult: true,
} as Person;
// 以下のコードはエラーになる
// person.age = "30"; // Type 'string' is not assignable to type 'number'.
Record
型は、キーと値の型のペアを指定して、オブジェクト型を生成するための型です。
const person: Record<string, any> = {
name: "John Doe",
age: 30,
isAdult: true,
};
// 以下のコードはエラーにならない
// person.address = "123 Main Street";
Partial
型は、既存の型から一部のプロパティを省略した型を生成するための型です。
interface Person {
name: string;
age: number;
isAdult: boolean;
}
const partialPerson: Partial<Person> = {
name: "John Doe",
// age: 30, // プロパティ 'age' は省略可能
isAdult: true,
};
interface Person {
name: string;
age: number;
isAdult: boolean;
}
const pickedPerson: Pick<Person, "name" | "isAdult"> = {
name: "John Doe",
// age: 30, // プロパティ 'age' は含まれない
isAdult: true,
};
interface Person {
name: string;
age: number;
isAdult: boolean;
}
const omittedPerson: Omit<Person, "age"> = {
name: "John Doe",
isAdult: true,
// age: 30, // プロパティ 'age' は含まれない
};
オブジェクトリテラルの型定義には、さまざまな方法があります。状況に応じて適切な方法を選択しましょう。
typescript