私はES6(ECMAscript 2016)Mapというプロパティを持つTypeScriptクラスを作成しています。
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
ES6 Mapの型をtypescriptで宣言するにはどうすればよいですか?
編集(2016年4月25日): 以下の答えは古く、最良の答えと見なされるべきではありません。 TypeScriptは現在「ネイティブに」マップをサポートしているため、出力がES6の場合はES6マップを使用できます。 ES5では、ポリフィルは提供されません。自分で埋め込む必要があります。
より詳しい情報は、 以下のモハメドヘガジーの答え /より現代的な答え - / このredditコメント 短いバージョンをご覧ください。
1.5.0ベータ時点では、TypeScriptはまだ Maps をサポートしていません。それはまだ ロードマップ の一部ではありません。
現在の最善の解決策は、型付きのキーと値を持つオブジェクトです(ハッシュマップとも呼ばれます)。 string
型のキーとnumber
型の値を持つオブジェクトの場合:
var arr : { [key:string]:number; } = {};
ただし、いくつか注意点があります。
string
またはnumber
型のみです。上記の例では:
// 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
内のコメントを参照してください: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScriptには組み込みのpollyfillsは付属していません。もしあれば、どのpollyfillを使用するかを決めるのはあなた次第です。 es6Collection 、 es6-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;
はい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")
ES6 Mapの型をtypescriptで宣言するにはどうすればよいですか?
--module es6
をターゲットにする必要があります。これは残念であり、あなたはここにあなたの懸念を提起することができます: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
最低限として:
tsconfig:
"lib": [
"es2015"
]
そして https://github.com/zloirock/core-js が必要な場合はIE <11 support: https://developer.mozilla.org/ja)のようなポリフィルをインストールします。 -US/docs/Web/JavaScript /リファレンス/ Global_Objects/Map
TypeScriptはまだMap
をサポートしていません。
lib設定オプション を使えば、あなたのプロジェクトにMapを選択することができます。 libセクションにes2015.collection
を追加するだけです。 lib設定がない場合は、 デフォルト を付けて追加し、es2015.collection
を追加します。
したがって、target:es5がある場合は、tsconfig.jsonを次のように変更します。
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],
"target": "ESNEXT"
プロパティをtsconfig.json
ファイルに追加します。
{
"compilerOptions": {
"target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
}
}
これが公式かどうかはわからないが、TypeScript 2.7.1ではこれがうまくいった。
class Item {
configs: Map<string, string>;
constructor () {
this.configs = new Map();
}
}
単純なMap<keyType, valueType>
に