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添加了各种各样的东西,而不是如果那些类型的断言不存在会发生什么。有人可以向我解释一下吗?谢谢!
答案 0 :(得分:2)
不需要<any>
强制转换并且不会影响任何内容,因为对该对象的唯一引用是通过groupHash
变量,编译器在帐户上推断出类型为Groups
的变量<Groups>
施法者我不确定编写代码的人为什么这样写,因为直接转换为Groups似乎在我的尝试中工作得很好 - 也许代码是为需要它的早期版本的编译器编写的?
据说,当你说“它为Intellisense添加了各种各样的东西”时,我不确定你的意思,因为编译器在groupHash上应该拥有的唯一类型信息是它引用了一些实现组的对象接口。当我玩这个代码时,将中间转换为“任何”都没有任何区别。在我使用带有字符串键的括号属性访问符号之前,VS 2012 Express没有给groupHash自动完成,此时它按预期列出了Group的“key”和“title”属性。
编辑:刚才意识到你可能根本就没有类型转换,此时“groupHash”的类型将是该对象文字的完整推断签名(因此定义中的所有4个属性都将由intellisense列出)。
没有这样做的原因是因为“groupHash”意味着要用作哈希表 - 所以你可以在运行时动态地添加和删除属性。虽然您仍然可以使用它而不将其转换为Groups接口,但是您打算如何使用该对象的通信并不清楚。即,新程序员查看代码,看到它上面有4个属性,假设这个静态类型将通过程序的生命周期得到维护,然后在运行时突然发现对象看起来完全不同,因为事情被添加并从中移除。