TypeScript严格数组和字典

3

我正在尝试定义一种类似于字典的类型。我无法弄清楚如何让Typescript编译器严格检查键类型。

var map: {[hello:number]: string} = {}
// I get the same results if I declare: var map: string[] = []

map[1.1] = "hello";
map[1.1] = 1.1;                 // error (as expected)
map["hello"] = "hello";         // missing error on key
map["hello"] = 1.1;             // missing error on key
var s2: string = map[1.1];
var i2: number = map[1.1];      // error (as expected)
var s1: string = map["hello"];  // missing error on key
var i1: number = map["hello"];  // missing error on key

我在使用Typescript 1.5.3和1.6.0-beta时得到了相同的结果。

2个回答

4
我无法确定如何让Typescript编译器严格检查键类型。 在TypeScript中,始终允许使用字符串索引。这是为了模拟这样一个事实:即使您说您正在按数字进行索引,您实际上也是按字符串进行索引(foo[1]相当于foo['1'])。 但是您也可以指定对字符串和数字的限制。但是请注意,它必须与number一致,因为毕竟number将在运行时转换为字符串。这消除了两个提到的错误情况:
var map: {
    [key: number]: string;
    [key: string]: string;
} = {};
// I get the same results if I declare: var map: string[] = []

map[1.1] = "hello";
map[1.1] = 1.1;                 // error (as expected)
map["hello"] = "hello";         // missing error on key
map["hello"] = 1.1;             // error
var s2: string = map[1.1];
var i2: number = map[1.1];      // error (as expected)
var s1: string = map["hello"];  // missing error on key
var i1: number = map["hello"];  // error

哎呀,太遗憾了,Typescript不能限制键(我尝试将其限制为“string”,但这似乎并没有真正起作用——看起来数字键会被隐式转换为字符串)。 - Kannan Goundan

-1
我创建了自己的字典类型,适用于下拉列表(我正在使用来自kendo UI的kendo下拉列表):
类型字典=数组<{键:字符串,值:字符串}>;

查找键操作在这里是O(N),对吧?我希望底层数据结构是Javascript本地哈希表,以便查找是O(1)。 - Kannan Goundan
啊,不,这只是一个简单的对象数组。对于真正的字典,我们需要像上面那样的解决方案。 - Maciej Lelito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接