web-dev-qa-db-ja.com

C#のように辞書型としてのTypeScriptオブジェクト

オブジェクトを辞書として使用するJavaScriptコードがあります。たとえば、「人物」オブジェクトには、電子メールアドレスから除外された個人情報が含まれます。

var people = {<email> : <'some personal data'>};

adding   > "people[<email>] = <data>;" 
getting  > "var data = people[<email>];" 
deleting > "delete people[<email>];"

これをTypescriptで記述することは可能ですか?または配列を使用する必要がありますか?

295
Robert Taylor

もちろんです。

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>を使うことができます

481
Ryan Cavanaugh

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を提供します。そのほとんどは、ヘルパー関数を一緒にハッキングせずに単純なObjectsで使用できません(これらの一部は、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());
107
John Weisz

あなたはこのようなテンプレートインターフェースを使うことができます:

interface Map<T> {
    [K: string]: T;
}

let dict: Map<number> = {};
dict["one"] = 1;
74

TypeScriptでRecord型を使うこともできます。

export interface nameInterface { 
    propName : Record<string, otherComplexInterface> 
}
6
Twen

Lodashは単純なDictionary実装を持ち、TypeScriptをサポートしています。

Lodashをインストールします。

npm install lodash @types/lodash --save

インポートと使用法

import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
    "key": "value"        
}
console.log(properties["key"])
5
phil