TypescriptのES6マップ


173

次のように、ES6(ECMAscript 2016)マップであるプロパティを持つtypescriptでクラスを作成しています:

class Item {
  configs: ????;
  constructor () {
    this.configs = new Map();
  }
}

typescriptでES6マップタイプを宣言するにはどうすればよいですか?

回答:


233

編集(2019年6月5日):「TypeScriptはMapネイティブでサポートされる」という考えはまだ当てはまりますが、バージョン2.1以降、TypeScriptはと呼ばれるものをサポートしていRecordます。

type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
    "a": { name: "joe" },
    "b": { name: "bart" },
};

残念ながら、最初のジェネリックパラメーター(キータイプ)はまだ完全に考慮されていません。stringタイプを使用しても、peopleA[0](a number)のようなものはまだ有効です。


編集(2016年4月25日):以下の回答は古く、最良の回答とは見なされません。TypeScriptは現在「ネイティブ」にマップをサポートしているため、出力がES6の場合にES6マップを使用することができます。ES5の場合、ポリフィルは提供されません。自分で埋め込む必要があります。

詳細については、以下のmohamed hegazyの回答で最新の回答を参照するか、この短いコメントのredditコメントを参照してください。


1.5.0ベータの時点で、TypeScriptはまだMapsをサポートしていません。まだロードマップの一部でもありません。

現在の最良の解決策は、キーと値を入力したオブジェクトです(ハッシュマップと呼ばれることもあります)。タイプのキーとタイプのstring値を持つオブジェクトの場合number

var arr : { [key:string]:number; } = {};

ただし、いくつかの注意点があります。

  1. キーはタイプstringまたはnumber
  2. 数値/文字列は交換可能に受け入れられるため(値のみが適用されるため)、実際にキータイプとして何を使用してもかまいません。

上記の例では:

// OK:
arr["name"] = 1; // String key is fine
arr[0] = 0; // Number key is fine too

// Not OK:
arr[{ a: "a" }] = 2; // Invalid key
arr[3] = "name"; // Invalid value

3
次に、マップのプロパティをどのように反復しますか?arr.values()を実行すると、「プロパティ 'values'はタイプに存在しません...」
Vern Jensen

同じではないvalues()、私はやるだろうfor (var key in arr) ... arr[key]for...of。その他の解決策(これはますます現実的になり、しばらくの間多くのことを行う予定です)は、corejsを使用することです
2015

実際、この方法で宣言されたマップのプロパティとして任意のキーを使用すると、「プロパティには 'type'には存在しない 'whatever'」と表示されます
rakslice

私はマップクラスを使用して1つを構築map Map<string,string>=new Map<string,string>()map.set(something) ていますが、例外が発生した場合でも、map is undefinedそれを初期化する別の方法はありますか?
mautrok

1
でもpolyfillsで、ES5をターゲットするときは、特定の機能を使用することはできません- github.com/Microsoft/TypeScript/issues/6842見る
Ondraジシュカ

128

コメントを参照してください:https : //github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

TypeScriptには組み込みのpollyfillsは付属していません。使用するPollyfillがある場合は、それを決定するのはあなた次第です。あなたのようなものを使用することができ es6CollectionES6-シムcorejs ..etcを。Typescriptコンパイラに必要なのは、使用するES6構造の宣言だけです。これらはすべてこのlibファイルで見つけることができます

ここに関連する部分があります:

interface Map<K, V> {
    clear(): void;
    delete(key: K): boolean;
    entries(): IterableIterator<[K, V]>;
    forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;
    get(key: K): V;
    has(key: K): boolean;
    keys(): IterableIterator<K>;
    set(key: K, value?: V): Map<K, V>;
    size: number;
    values(): IterableIterator<V>;
    [Symbol.iterator]():IterableIterator<[K,V]>;
    [Symbol.toStringTag]: string;
}

interface MapConstructor {
    new <K, V>(): Map<K, V>;
    new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>;
    prototype: Map<any, any>;
}
declare var Map: MapConstructor;

3
でもpolyfillsで、ES5をターゲットするときは、特定の機能を使用することはできません-参照github.com/Microsoft/TypeScript/issues/6842
Ondraジシュカ


30

はいMapがtypescriptで利用可能になりました。lib.es6.d.tsを見ると、インターフェースが表示されます。

interface Map<K, V> {
  clear(): void;
  delete(key: K): boolean;
  forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void,thisArg?: any): void;
  get(key: K): V | undefined;
  has(key: K): boolean;
  set(key: K, value: V): this;
  readonly size: number;} 

文字列、オブジェクトのペアのディクショナリとして使用するのは素晴らしいことです。唯一の問題は、Map.get(key)を使用して他の場所に値を割り当てるために使用している場合、コードのようなIDEが未定義の可能性に関する問題を提供することです。 is-definedチェックで変数を作成する..タイプをキャストするだけです(マップにキーと値のペアがあることを知っていると仮定)

class myclass {
   mymap:Map<string,object>
   ...
   mymap = new Map<string,object>()
   mymap.set("akey",AnObject)
   let objectref = <AnObject>mymap.get("akey")



4

これが公式であるかどうかはわかりませんが、typescript 2.7.1ではこれでうまくいきました:

class Item {
   configs: Map<string, string>;
   constructor () {
     this.configs = new Map();
   }
}

簡単に Map<keyType, valueType>


3

LIBの設定オプションあなたは桜プロジェクトに地図を選択することができます。es2015.collectionlibセクションに追加するだけです。lib configがない場合は、デフォルトを追加してを追加しes2015.collectionます。

したがって、ターゲットがes5の場合は、tsconfig.jsonを次のように変更します。

"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],


0

ファイルに"target": "ESNEXT"プロパティを追加しtsconfig.jsonます。

{
    "compilerOptions": {
        "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.