2013-03-17 25 views
10

Tôi đang chơi với Typecript và chuyển đổi qua một thư viện nhỏ sang Javascript từ Javascript. Trong một khu vực của mã có một bản đồ được xác định tĩnh của tên khóa thân thiện với mã khóa của họ. Mã gốc trông giống như:làm cách nào để xác định từ điển số-> trong Loại bản ghi?

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

tôi định nghĩa này trong nguyên cảo qua:

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

Điều này dường như làm việc tốt, tuy nhiên một phần khác của mã sử dụng ánh xạ ngược lại:

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

Vì vậy, tôi đã cố gắng thực hiện cùng một loại định nghĩa trong bản kiểu mà tôi đã làm trước đây:

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

này thất bại trong việc biên dịch với các lỗi sau:

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

Làm thế nào để xác định bản đồ này trong nguyên cảo?

Trả lời

8

Vấn đề là trong JavaScript - và do đó trong TypeScript - các khóa của một đối tượng theo nghĩa đen luôn là chuỗi, và do đó nó không thể được gán cho một biến với một số chỉ mục.

Một đối tượng với một indexer số là một mảng - và vì vậy bạn phải làm điều này:

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

Thật vậy js chỉ số nội bộ chỉ có dựa trên chuỗi (với mảng là khác nhau từ {}) nhưng chuỗi/số chuyển đổi là ổn định trong js:

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

tôi nghĩ rằng nguyên cảo nên hỗ trợ nó là tốt và tạo ra một hạng mục công trình, bạn có thể bỏ phiếu: http://typescript.codeplex.com/workitem/832

2

Here's a library called Classical.js * có thể giúp bạn thực hiện điều này và các vấn đề tương tự. Nó định nghĩa, trong số những thứ khác, một từ điển chung kép. Đối với trường hợp sử dụng của bạn, mã sẽ trông như thế này:

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

điển < TKey, TValue > làm việc với tất cả các loại của các đối tượng và không có vấn đề với xung đột tên như phím có tên là 'constructor'.

Đối với các bản đồ ngược lại bạn có thể xây dựng từ điển nghịch đảo hoặc truy vấn hiện một mặt hàng như vậy:

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

Nếu bạn muốn cung cấp cho nó một thử, hãy truy cập Classical, mở thư mục bin và thêm classical.js và classical.d.ts vào dự án của bạn.

Hy vọng điều đó sẽ hữu ích.


* Tôi là một trong các nhà phát triển trong nhóm cổ điển

Các vấn đề liên quan