回答:
編集(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; } = {};
ただし、いくつかの注意点があります。
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
map Map<string,string>=new Map<string,string>()
しmap.set(something)
ていますが、例外が発生した場合でも、map is undefined
それを初期化する別の方法はありますか?
コメントを参照してください:https : //github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScriptには組み込みのpollyfillsは付属していません。使用するPollyfillがある場合は、それを決定するのはあなた次第です。あなたのようなものを使用することができ es6Collection、 ES6-シム、 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;
TS2304
、このチェックしてください:stackoverflow.com/questions/39416691/...を
はい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")
typescriptでES6マップタイプを宣言するにはどうすればよいですか?
ターゲティングする必要があり--module es6
ます。これは不幸であり、ここであなたの懸念を提起することができます:https : //github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
最低限として:
tsconfig:
"lib": [
"es2015"
]
そのようにポリフィルをインストールhttps://github.com/zloirock/core-jsあなたがIEをしたい場合は、<11のサポート:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /地図
LIBの設定オプションあなたは桜プロジェクトに地図を選択することができます。es2015.collection
libセクションに追加するだけです。lib configがない場合は、デフォルトを追加してを追加しes2015.collection
ます。
したがって、ターゲットがes5の場合は、tsconfig.jsonを次のように変更します。
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],
TypescriptはまだサポートしていませんMap
。