2013-03-17 12 views
10

Gram na Maszynistce i konwertuję do małej biblioteki na nią z Javascript. W jednym obszarze kodu znajdowało się statycznie zdefiniowane mapowanie przyjaznej nazwy klucza do ich kodu. Oryginalny kod wyglądał następująco:Jak zdefiniować słownik słowników liczbowych w Skrypcie?

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

I określonych to w maszynie za pomocą:

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

ten wydaje się działać dobrze, jednak inna część kodu wykorzystuje odwrotny mapowanie:

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

Więc próbowałem zrobić ten sam typ definicji w maszynopisie, który wcześniej zrobiłem:

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

To nie skompilować z powodu następującego błędu:

Cannot convert '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' to '{ [name: number]: string; }': Index signatures of types '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' and '{ [name: number]: string; }' are incompatible

Jak mogę określić to mapowanie na maszynie?

Odpowiedz

8

Problem polega na tym, że w JavaScript - a więc w TypeScript - klucze literału obiektu są zawsze ciągami, a więc nie można ich przypisać do zmiennej z indeksem liczb.

Obiekt z numerem indekser jest tablicą - a więc trzeba to zrobić:

var chars: string[] = []; 
chars[8]= "Backspace"; 
chars[9]= "Tab"; 
chars[13] = "Enter"; 
1

Rzeczywiście js indeksy wewnętrznie tylko w oparciu ciąg ma (z Array jest różny od {}), ale ciąg/liczba konwersja jest stabilny w JS:

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

myślę maszynopis powinien go wspierać, jak również i stworzył elementu roboczego można głosować na: http://typescript.codeplex.com/workitem/832

2

Here's a library called Classical.js *, które mogą pomóc w rozwiązaniu tego i podobnych problemów. Definiuje między innymi słownik podwójnie generyczny. Dla Państwa przypadku użycia, kod wyglądałby następująco:

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... 

słownika korzystał < TKey, TValue > współpracuje ze wszystkimi typami obiektów i nie ma problemów z kolizji nazw takich jak klucze o nazwach „konstruktor”.

Na przeciwległym mapowania można też skonstruować słownika odwrotną lub zapytania aktualny jeden tak:

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... 

Jeśli chcesz spróbować znaleźć Classical, otwórz folder bin i dodaj klasyczne.js i klasyczne.d.ts do swojego projektu.

Nadzieję, że pomaga.


* Jestem jednym z deweloperów na klasycznym zespołem

Powiązane problemy