TypeScript クラスのキー操作
TypeScript では、keyof
演算子を使用して、クラスのプロパティの型を取得することができます。この演算子は、指定されたオブジェクトのすべてのキーの型を列挙するユニオン型を生成します。
例
class Person {
name: string;
age: number;
address: string;
}
type PersonKeys = keyof Person; // type PersonKeys = "name" | "age" | "address"
// PersonKeys を使用してプロパティの型を取得する
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const person = new Person();
person.name = "John Doe";
person.age = 30;
person.address = "123 Main St";
const name: string = getProperty(person, "name");
const age: number = getProperty(person, "age");
const address: string = getProperty(person, "address");
この例では、PersonKeys
型が keyof Person
演算子を使用して定義されています。この型は、Person
クラスのすべてのプロパティのキーの型を列挙するユニオン型 name
| age
| address
を表します。
getProperty
関数は、ジェネリック型 T
と K extends keyof T
を使用して、任意のオブジェクト obj
とそのプロパティのキー key
を受け取り、そのプロパティの型 T[K]
を返します。
getProperty
関数を呼び出すときには、person
オブジェクトとプロパティのキーを渡します。関数は、対応するプロパティの型を推論し、正しい型で値を返します。
TypeScript クラスのキー操作: keyof 演算子を使用したプロパティ型の取得
keyof 演算子は、TypeScript でクラスのプロパティの型を取得するために使用されます。この演算子は、指定されたオブジェクトのすべてのキーの型を列挙するユニオン型を生成します。
class Person {
name: string;
age: number;
address: string;
}
// keyof 演算子を使用してプロパティの型を取得する
type PersonKeys = keyof Person; // type PersonKeys = "name" | "age" | "address"
// PersonKeys を使用してプロパティの型を取得する関数
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const person = new Person();
person.name = "John Doe";
person.age = 30;
person.address = "123 Main St";
// プロパティの型を安全に取得する
const name: string = getProperty(person, "name");
const age: number = getProperty(person, "age");
const address: string = getProperty(person, "address");
コードの説明:
-
Person クラス
-
keyof Person
-
プロパティの取得
keyof 演算子の利点:
- コードの簡潔性
keyof
演算子を使用することで、プロパティの型を宣言するコードを簡潔に記述できます。 - 柔軟性
任意のオブジェクトとプロパティのキーを渡すことができるため、さまざまなシナリオに対応できます。 - 型安全
プロパティの型を正確に取得し、コンパイル時に型チェックを行うことができます。
インデックスシグネチャ (Index Signatures)
インデックスシグネチャを使用すると、オブジェクトの任意のキーに対するプロパティの型を指定できます。
interface Person {
[key: string]: any;
name: string;
age: number;
address: string;
}
// インデックスシグネチャを使用してプロパティの型を取得する
function getProperty<T extends object, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
この方法では、Person
インターフェイスにインデックスシグネチャ [key: string]: any
を追加し、任意のキーに対するプロパティの型を any
に指定しています。これにより、getProperty
関数は任意のプロパティの型を取得できます。
マッピング型 (Mapped Types)
マッピング型を使用すると、既存の型のプロパティを新しい型に変換することができます。
type PersonKeys = keyof Person;
type PersonProperties = {
[K in PersonKeys]: Person[K];
};
// マッピング型を使用してプロパティの型を取得する
function getProperty<T extends object, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
この方法では、マッピング型 PersonProperties
を定義し、Person
クラスのプロパティの型をそのまま保持しています。これにより、getProperty
関数は任意のプロパティの型を取得できます。
ジェネリック型制約
ジェネリック型制約を使用すると、ジェネリック型の引数に対して特定の条件を指定することができます。
function getProperty<T extends { [K in keyof T]: any }, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
この方法では、getProperty
関数のジェネリック型 T
に対して、すべてのプロパティが any
型であるという制約を指定しています。これにより、任意のプロパティの型を取得できます。
typescript