如何在Typescript中定义number->字符串字典?

时间:2013-03-17 15:53:37

标签: typescript

我正在使用Typescript并通过Javascript将小型库转换为它。在代码的一个区域中,存在静态定义的友好密钥名称与其密钥代码的映射。原始代码看起来像:

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

我通过以下方式在打字稿中定义了这个:

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

这似乎工作正常,但代码的另一部分使用相反的映射:

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

所以我尝试在之前做过的打字稿中做同样类型的定义:

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

无法使用以下错误进行编译:

  

无法转换'{0:string; 1:字符串; 2:字符串; 4:字符串; 8:字符串; 9:字符串; :string; }'to'{{name:number]:string; }':类型'{0:string;的索引签名; 1:字符串; 2:字符串; 4:字符串; 8:字符串; 9:字符串; :string; }'和'{[name:number]:string; }'不兼容

如何在Typescript中定义此映射?

3 个答案:

答案 0 :(得分:9)

问题在于,在JavaScript中 - 因此在TypeScript中 - 对象文字的键始终是字符串,因此不能将其分配给带有数字索引器的变量。

带有数字索引器的对象是一个数组 - 所以你必须这样做:

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

答案 1 :(得分:2)

Here's a library called 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...

字典&lt; TKey,TValue&gt;适用于所有类型的对象,并且不存在名称冲突问题,例如名为&#39;构造函数的键。

对于相反的映射,您可以构造逆字典或查询当前字典:

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文件夹,将classical.js和classical.d.ts添加到您的项目中。

希望有所帮助。


*我是古典团队的开发人员之一

答案 2 :(得分:1)

实际上js内部只有基于字符串的索引(数组与{}不同)但字符串/数字转换在js中是稳定的:

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

我认为打字稿也应该支持它并创建了一个你可以投票的工作项目:http://typescript.codeplex.com/workitem/832