TypeScriptでネストされたオブジェクトのインターフェースを定義する方法
TypeScriptでは、ネストされたオブジェクトの構造を明確に定義するために、インターフェースを使用します。ネストされたオブジェクトとは、オブジェクトのプロパティとして別のオブジェクトが含まれているものです。
基本的な例
interface Person {
name: string;
age: number;
address: {
street: string;
city: string;
zipCode: string;
};
}
この例では、Person
インターフェースが定義されています。このインターフェースには、name
、age
、address
というプロパティが含まれています。address
プロパティは、street
、city
、zipCode
というプロパティを持つ別のオブジェクト(ネストされたオブジェクト)です。
ネストされたオブジェクトのインターフェースを別途定義する
ネストされたオブジェクトが複雑な構造を持つ場合、そのインターフェースを別途定義することもできます。
interface Address {
street: string;
city: string;
zipCode: string;
}
interface Person {
name: string;
age: number;
address: Address;
}
この例では、Address
インターフェースが最初に定義され、その後、Person
インターフェースでAddress
インターフェースを参照しています。
ネストされたオブジェクトのオプションプロパティ
ネストされたオブジェクトのプロパティがオプションである場合、?
マークを使用して定義します。
interface Person {
name: string;
age: number;
address?: {
street: string;
city: string;
zipCode: string;
};
}
この例では、address
プロパティはオプションであり、存在しない場合もあります。
ネストされたオブジェクトの配列
ネストされたオブジェクトの配列を定義するには、[]
を使用します。
interface Person {
name: string;
age: number;
addresses: Address[];
}
この例では、addresses
プロパティはAddress
インターフェースを満たすオブジェクトの配列です。
interface Person {
name: string;
age: number;
address: {
street: string;
city: string;
zipCode: string;
};
}
interface Address {
street: string;
city: string;
zipCode: string;
}
interface Person {
name: string;
age: number;
address: Address;
}
interface Person {
name: string;
age: number;
address?: {
street: string;
city: string;
zipCode: string;
};
}
interface Person {
name: string;
age: number;
addresses: Address[];
}
型ガード(Type Guards)
型ガードは、変数の型を特定の型であるかどうかを確認する関数または式です。型ガードを使用して、ネストされたオブジェクトの型を検証することができます。
function isPerson(obj: any): obj is Person {
return obj && typeof obj.name === 'string' && typeof obj.age === 'number' && typeof obj.address === 'object';
}
const person: any = { name: 'John', age: 30, address: { street: 'Main St', city: 'New York', zipCode: '10001' } };
if (isPerson(person)) {
console.log(person.name); // John
console.log(person.address.city); // New York
}
この例では、isPerson
関数を使用して、person
オブジェクトがPerson
インターフェースを満たしているかどうかを確認しています。もし満たしていれば、person
オブジェクトのプロパティにアクセスすることができます。
アサーション(Assertions)
アサーションは、変数の型を強制的に指定するものです。ただし、アサーションは型チェックを行わないため、誤った型を指定するとランタイムエラーが発生する可能性があります。
const person: any = { name: 'John', age: 30, address: { street: 'Main St', city: 'New York', zipCode: '10001' } };
const personObj = person as Person;
console.log(personObj.name); // John
console.log(personObj.address.city); // New York
この例では、as Person
を使用して、person
オブジェクトの型を強制的にPerson
インターフェースに指定しています。
型推論(Type Inference)
TypeScriptは、変数の型を自動的に推論することができます。ネストされたオブジェクトの場合も、変数の初期化時に型を推論することが可能です。
const person = { name: 'John', age: 30, address: { street: 'Main St', city: 'New York', zipCode: '10001' } };
console.log(person.name); // John
console.log(person.address.city); // New York
この例では、person
変数の型が自動的にPerson
インターフェースとして推論されています。
typescript