385

オブジェクトを辞書として使用するJavaScriptコードがいくつかあります。たとえば、「person」オブジェクトは、電子メールアドレスからキーオフされたいくつかの個人情報を保持します。

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

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

Typescriptでこれを説明することは可能ですか?または、アレイを使用する必要がありますか?

4

6 に答える 6

607

新しいバージョンのtypescriptでは、次のものを使用できます。

type Customers = Record<string, Customer>

古いバージョンでは、次を使用できます。

var map: { [email: string]: Customer; } = { };
map['foo@gmail.com'] = new Customer(); // OK
map[14] = new Customer(); // Not OK, 14 is not a string
map['bar@hotmail.com'] = 'x'; // Not OK, 'x' is not a customer

タイプアノテーション全体を毎回入力したくない場合は、インターフェイスを作成することもできます。

interface StringToCustomerMap {
    [email: string]: Customer;
}

var map: StringToCustomerMap = { };
// Equivalent to first line of above
于 2012-11-29T17:51:40.263 に答える
149

マップのようなオブジェクトを使用することに加えて、実際のMapオブジェクトがしばらくの間存在していました。これは、ES6にコンパイルするとき、またはES6の型定義でポリフィルを使用するときにTypeScriptで使用できます。

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");

これだけでも、次のようなマップのようなオブジェクトを使用するよりもいくつかの利点があります。

  • 文字列に基づかないキーのサポート。たとえば、数字やオブジェクト。どちらもサポートされていませんObject(いいえ、Object数字はサポートされていません。文字列に変換されます)
  • オブジェクトにはインデックス署名がない可能性があるのに対し、常にキータイプと--noImplicitAnyタイプがあるため、を使用しない場合のエラーの余地が少なくなります。Map
  • アイテム(キーと値のペア)を追加/削除する機能は、プロパティの作成とは異なり、タスク用に最適化されています。Object

さらに、Mapオブジェクトは一般的なタスクに対してより強力でエレガントなAPIを提供します。これらのほとんどは、Objectヘルパー関数をハックしないと単純なものでは利用できません(ただし、これらの一部では、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());
于 2017-02-14T10:36:14.767 に答える
83

次のようなテンプレートインターフェイスを使用できます。

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

let dict: Map<number> = {};
dict["one"] = 1;
于 2015-09-26T14:59:33.533 に答える
11

typescriptでRecord型を使用することもできます:

export interface nameInterface { 
    propName : Record<string, otherComplexInterface> 
}
于 2018-03-26T15:18:22.313 に答える
9

これに使用できますRecord

https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt

例(AppointmentStatus列挙型といくつかのメタデータ間のマッピング):

  const iconMapping: Record<AppointmentStatus, Icon> = {
    [AppointmentStatus.Failed]: { Name: 'calendar times', Color: 'red' },
    [AppointmentStatus.Canceled]: { Name: 'calendar times outline', Color: 'red' },
    [AppointmentStatus.Confirmed]: { Name: 'calendar check outline', Color: 'green' },
    [AppointmentStatus.Requested]: { Name: 'calendar alternate outline', Color: 'orange' },
    [AppointmentStatus.None]: { Name: 'calendar outline', Color: 'blue' }
  }

値としてインターフェースを使用するようになりました。

interface Icon { Name: string Color: string }

使用法:

const icon: SemanticIcon = iconMapping[appointment.Status]

于 2019-09-30T14:02:34.263 に答える
8

Lodashには、単純な辞書の実装があり、TypeScriptを適切にサポートしています。

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

npm install lodash @types/lodash --save

インポートと使用法:

import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
    "key": "value"        
}
console.log(properties["key"])
于 2017-10-25T17:20:28.053 に答える