TypeScript オブジェクトを辞書型として使う - C# の Dictionary との比較
TypeScript オブジェクトを辞書型として使用する方法
オブジェクトリテラル
TypeScript では、オブジェクトリテラルを使用して、プロパティと値のペアの集合を定義できます。 例えば、以下のコードは、名前と年齢を持つ人物を表すオブジェクトリテラルを定義します。
const person = {
name: "John Doe",
age: 30
};
このオブジェクトリテラルは、name
と age
という 2 つのプロパティを持ちます。 name
プロパティは文字列型で、age
プロパティは数値型です。
オブジェクトを辞書型として使用
オブジェクトリテラルは、キーと値のペアを格納する辞書として使用できます。 例えば、以下のコードは、person
オブジェクトを辞書として使用して、名前から年齢を取得します。
const age = person["name"]; // 30
このコードは、person
オブジェクトの name
プロパティにアクセスし、その値である 30
を取得します。
オブジェクトの型
オブジェクトリテラルの型は、Record<TKey, TValue>
型を使用して定義できます。 例えば、以下のコードは、名前と年齢を持つ人物を表すオブジェクトリテラルの型を定義します。
type Person = Record<string, number>;
const person: Person = {
name: "John Doe",
age: 30
};
このコードでは、Person
型は、文字列型のキーと数値型の値を持つオブジェクトを表します。
インデックスシグネチャ
オブジェクトリテラルの型にインデックスシグネチャを追加することで、より柔軟な辞書型を作成できます。 例えば、以下のコードは、任意の型のキーと値を持つオブジェクトを表すインデックスシグネチャを定義します。
type Dictionary<TKey, TValue> = {
[key: TKey]: TValue;
};
const dictionary: Dictionary<string, number> = {
name: "John Doe",
age: 30
};
このコードでは、Dictionary
型は、TKey
型のキーと TValue
型の値を持つオブジェクトを表します。
基本的なオブジェクトリテラル
const person = {
name: "John Doe",
age: 30,
address: {
city: "New York",
state: "NY"
}
};
// オブジェクトのプロパティにアクセス
console.log(person.name); // "John Doe"
console.log(person.age); // 30
// オブジェクトのプロパティを更新
person.age = 31;
// オブジェクトのネストしたプロパティにアクセス
console.log(person.address.city); // "New York"
const person = {
name: "John Doe",
age: 30,
hobbies: ["coding", "reading", "hiking"]
};
// オブジェクトを辞書として使用して値を取得
console.log(person["name"]); // "John Doe"
console.log(person["hobbies"][1]); // "reading"
// オブジェクトにキーが存在するかどうかを確認
console.log("age" in person); // true
console.log("job" in person); // false
type Person = {
name: string;
age: number;
hobbies: string[];
};
const person: Person = {
name: "John Doe",
age: 30,
hobbies: ["coding", "reading", "hiking"]
};
// 型チェック
console.log(person.name); // "John Doe"
// person.age = "30"; // エラー: 型 'string' を 'number' に割り当てることはできません。
// オブジェクトの型を使用して新しいオブジェクトを作成
const newPerson: Person = {
name: "Jane Doe",
age: 25,
hobbies: ["painting", "writing", "dancing"]
};
type Dictionary<TKey, TValue> = {
[key: TKey]: TValue;
};
const dictionary: Dictionary<string, number> = {
name: "John Doe",
age: 30,
city: "New York"
};
// インデックスシグネチャを使用して値を取得
console.log(dictionary["name"]); // "John Doe"
// インデックスシグネチャを使用して値を追加
dictionary["job"] = "Software Engineer";
// 任意の型のキーと値を持つオブジェクト
const anyDictionary: Dictionary<any, any> = {
name: "John Doe",
age: 30,
hobbies: ["coding", "reading", "hiking"],
address: {
city: "New York",
state: "NY"
}
};
- オブジェクトのループ処理
- オブジェクトのシリアル化と逆シリアル化
Map クラス
Map
クラスは、キーと値のペアの順序付きコレクションを提供します。 オブジェクトを辞書として使用する場合、Map
クラスは良い選択肢となります。
const person = new Map([
["name", "John Doe"],
["age", 30],
["hobbies", ["coding", "reading", "hiking"]]
]);
// Map クラスを使用して値を取得
console.log(person.get("name")); // "John Doe"
// Map クラスを使用して値を追加
person.set("job", "Software Engineer");
// Map クラスを使用して値を削除
person.delete("age");
// Map クラスをループ処理
for (const [key, value] of person) {
console.log(key, value);
}
Record 型
Record
型は、キーと値のペアのオブジェクトリテラル型を生成します。 オブジェクトの型を厳密に定義したい場合、Record
型は良い選択肢となります。
type Person = Record<string, any>;
const person: Person = {
name: "John Doe",
age: 30,
hobbies: ["coding", "reading", "hiking"]
};
// 型チェック
console.log(person.name); // "John Doe"
// person.age = "30"; // エラー: 型 'string' を 'number' に割り当てることはできません。
ライブラリ
いくつかのライブラリは、TypeScript オブジェクトを辞書型として使用するための便利な機能を提供します。 例えば、lodash
ライブラリの _.mapKeys
関数は、オブジェクトのキーを別のキーに変換します。
import _ from "lodash";
const person = {
name: "John Doe",
age: 30,
hobbies: ["coding", "reading", "hiking"]
};
const newPerson = _.mapKeys(person, (value, key) => {
return key.toUpperCase();
});
console.log(newPerson); // { NAME: "John Doe", AGE: 30, HOBBIES: ["coding", "reading", "hiking"] }
arrays object dictionary