web-dev-qa-db-ja.com

ES6マップをタイプスクリプトで

私はES6(ECMAscript 2016)Mapというプロパティを持つTypeScriptクラスを作成しています。

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

ES6 Mapの型をtypescriptで宣言するにはどうすればよいですか?

106
nicksrandall

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

より詳しい情報は、 以下のモハメドヘガジーの答え /より現代的な答え - / この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
146
zeh

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

TypeScriptには組み込みのpollyfillsは付属していません。もしあれば、どのpollyfillを使用するかを決めるのはあなた次第です。 es6Collectiones6-shims/corejs ..などのように使用できます。 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;
116
mohamed hegazy

これが一例です。

this.configs = new Map<string, string>();
this.configs.set("key", "value");

デモ

34
Arnaud

はい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を使用して値を割り当てることです。定義されていないチェックで変数を作成するのではなく、未定義になる可能性があるという問題。単に型をキャストするだけです(マップにキーと値のペアがあることが確実にわかっていると仮定して)。

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

ES6 Mapの型をtypescriptで宣言するにはどうすればよいですか?

--module es6をターゲットにする必要があります。これは残念であり、あなたはここにあなたの懸念を提起することができます: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111

12
basarat
9
Nikos

TypeScriptはまだMapをサポートしていません。

ES6互換表

3
Logan Tegman

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

したがって、target:es5がある場合は、tsconfig.jsonを次のように変更します。

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

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

{
    "compilerOptions": {
        "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    }
}
0
Yas

これが公式かどうかはわからないが、TypeScript 2.7.1ではこれがうまくいった。

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

単純なMap<keyType, valueType>

0
Jonas Tomanga