オブジェクトを辞書として使用するJavaScriptコードがあります。たとえば、「人物」オブジェクトには、電子メールアドレスから除外された個人情報が含まれます。
var people = {<email> : <'some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
これをTypescriptで記述することは可能ですか?または配列を使用する必要がありますか?
もちろんです。
var map: { [email: string]: Customer; } = { };
map['[email protected]'] = new Customer(); // OK
map[14] = new Customer(); // Not OK, 14 is not a string
map['[email protected]'] = 'x'; // Not OK, 'x' is not a customer
毎回その全タイプ注釈をタイプアウトしたくない場合は、インターフェースを作ることもできます。
interface StringToCustomerMap {
[email: string]: Customer;
}
var map: StringToCustomerMap = { };
// Equivalent to first line of above
TypeScriptの新しいバージョンではRecord<string, Customer>
を使うことができます
Map-likeオブジェクトの使用に加えて、実際の Map
オブジェクトがあります しばらくの間、TypeScriptで利用可能ですES6にコンパイルするか、ES6でポリフィルを使用する場合 type-definitions :
let people = new Map<string, Person>();
Object
などと同じ機能を、わずかに異なる構文でサポートします。
// Adding an item (a key-value pair):
people.set("John", { firstName: "John", lastName: "Doe" });
// Checking for the presence of a key:
people.has("John"); // true
// Retrieving a value by a key:
people.get("John").lastName; // "Doe"
// Deleting an item by a key:
people.delete("John");
これだけで、次のようなmap-likeオブジェクトを使用するよりもいくつかの利点があります。
Object
でサポートされていない数値またはオブジェクト(いいえ、Object
は数値をサポートしません。文字列に変換します)Map
には常にkeyタイプとがあるため、--noImplicitAny
を使用しない場合のエラーの余地が少ないvalueタイプ、オブジェクトmightにはインデックス署名がないObject
にプロパティを作成するのとは異なりますさらに、Map
オブジェクトは、一般的なタスクのためのより強力でエレガントなAPIを提供します。そのほとんどは、ヘルパー関数を一緒にハッキングせずに単純なObject
sで使用できません(これらの一部は、ES5ターゲット以下の完全なES6イテレーター/反復可能なポリフィルを必要とします):
// Iterate over Map entries:
people.forEach((person, key) => ...);
// Clear the Map:
people.clear();
// Get Map size:
people.size;
// Extract keys into array (in insertion order):
let keys = Array.from(people.keys());
// Extract values into array (in insertion order):
let values = Array.from(people.values());
あなたはこのようなテンプレートインターフェースを使うことができます:
interface Map<T> {
[K: string]: T;
}
let dict: Map<number> = {};
dict["one"] = 1;
TypeScriptでRecord型を使うこともできます。
export interface nameInterface {
propName : Record<string, otherComplexInterface>
}
Lodashは単純なDictionary実装を持ち、TypeScriptをサポートしています。
Lodashをインストールします。
npm install lodash @types/lodash --save
インポートと使用法
import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
"key": "value"
}
console.log(properties["key"])