17

私は Typescript で遊んでいて、小さなライブラリを Javascript からそれに変換しています。コードの 1 つの領域では、フレンドリ キー名からキーコードへの静的に定義されたマッピングがありました。元のコードは次のようになります。

keys: { "Backspace": 8, "Tab": 9, "Enter": 13, ....etc.. };

これを typescript で次のように定義しました。

static keys: { [name: string]: number; } = { "Backspace": 8, "Tab": 9, "Enter": 13, ... etc.. };

これは問題なく動作するように見えますが、コードの別の部分では反対のマッピングを使用しています。

    chars: {8:"Backspace",9:"Tab",13:"Enter", ...etc... };

そこで、以前に行ったのと同じタイプの定義を typescript で実行しようとしました。

chars: { [code: number]: string; } = { 8: "Backspace", 9: "Tab", 13: "Enter", ...etc.. };

これは、次のエラーでコンパイルに失敗します:

'{ 0: 文字列; を変換できません。1: 文字列; 2: 文字列; 4: 文字列; 8: 文字列; 9: 文字列; : ストリング; }' から '{ [名前: 番号]: 文字列; }': 型のインデックス シグネチャ '{ 0: string; 1: 文字列; 2: 文字列; 4: 文字列; 8: 文字列; 9: 文字列; : ストリング; }' および '{ [名前: 番号]: 文字列; }' は互換性がありません

Typescriptでこのマッピングを定義するにはどうすればよいですか?

4

3 に答える 3

11

問題は、JavaScript(つまりTypeScript)では、オブジェクトリテラルのキーは常に文字列であるため、数値インデクサーを使用して変数に割り当てることができないことです。

数値インデクサを持つオブジェクトは配列であるため、次のようにする必要があります。

var chars: string[] = [];
chars[8]= "Backspace";
chars[9]= "Tab";
chars[13] = "Enter";
于 2013-03-17T17:54:16.547 に答える
2

実際、jsは内部的に文字列ベースのインデックス(配列は{}とは異なります)しか持っていませんが、文字列/数値の変換はjsで安定しています:

var x = {0 : "asdf",1:"bb"} 
alert(x[0])
alert(x[1])

typescriptもそれをサポートし、投票できるワークアイテムを作成する必要があると思います:http://typescript.codeplex.com/workitem/832

于 2013-03-19T05:58:14.923 に答える
2

これと同様の問題を解決するのに役立つ可能性があるClassical.js * というライブラリがあります。とりわけ、二重に一般的な辞書を定義します。あなたのユースケースでは、コードは次のようになります。

import c = Classical.Collections;

var keys = new c.Dictionary<string, number>();
keys.add("Backspace", 8);
keys.add("Tab", 9);
keys.add("Enter", 13);
//etc...

keys.getValue("Backspace"); //8
keys.getValue("Tab"); //9
keys.getValue("Enter"); //13
//etc...

Dictionary<TKey, TValue> は、すべての種類のオブジェクトで機能し、「コンストラクター」という名前のキーなどの名前の競合に関する問題はありません。

反対のマッピングでは、逆辞書を作成するか、現在の辞書を次のようにクエリできます。

keys.query().single(pair => pair.key === 8).value; //"Backspace"
keys.query().single(pair => pair.key === 9).value; //"Tab"
keys.query().single(pair => pair.key === 13).value; //"Enter"
//etc...

試してみたい場合は、Classicalにアクセスして bin フォルダーを開き、classic.js と classic.d.ts をプロジェクトに追加してください。

それが役立つことを願っています。


* 私はクラシック チームの開発者の 1 人です

于 2014-10-22T10:23:02.213 に答える