有人可以从百科全书样本中解释我不理解的双重类型断言吗?

时间:2012-10-16 01:53:51

标签: typescript

data.js中的TypeScript百科全书示例代码使用双重类型断言,但似乎没有做任何事情:

export interface Group {
  key: string;
  title: string;   
}

interface Groups {
  [idx: string]: Group;
}

var groupsHash = **<Groups>(<any>**{ 
  recent: { key: 'recent', title: 'Recent' },
  favorites: { key: 'favorites', title: 'Favorites' },
  today: { key: 'today', title: 'Today' },
  nearby: { key: 'xxnearby', title: 'Nearby' }
});

事实上,使用这些类型的断言似乎使得使用groupsHash变量变得更难,因为它向Intellisense添加了各种各样的东西,而不是如果那些类型的断言不存在会发生什么。有人可以向我解释一下吗?谢谢!

1 个答案:

答案 0 :(得分:2)

不需要<any>强制转换并且不会影响任何内容,因为对该对象的唯一引用是通过groupHash变量,编译器在帐户上推断出类型为Groups的变量<Groups>施法者我不确定编写代码的人为什么这样写,因为直接转换为Groups似乎在我的尝试中工作得很好 - 也许代码是为需要它的早期版本的编译器编写的?

据说,当你说“它为Intellisense添加了各种各样的东西”时,我不确定你的意思,因为编译器在groupHash上应该拥有的唯一类型信息是它引用了一些实现组的对象接口。当我玩这个代码时,将中间转换为“任何”都没有任何区别。在我使用带有字符串键的括号属性访问符号之前,VS 2012 Express没有给groupHash自动完成,此时它按预期列出了Group的“key”和“title”属性。

编辑:刚才意识到你可能根本就没有类型转换,此时“groupHash”的类型将是该对象文字的完整推断签名(因此定义中的所有4个属性都将由intellisense列出)。

没有这样做的原因是因为“groupHash”意味着要用作哈希表 - 所以你可以在运行时动态地添加和删除属性。虽然您仍然可以使用它而不将其转换为Groups接口,但是您打算如何使用该对象的通信并不清楚。即,新程序员查看代码,看到它上面有4个属性,假设这个静态类型将通过程序的生命周期得到维护,然后在运行时突然发现对象看起来完全不同,因为事情被添加并从中移除。