Typescript 有人能解释我不知道的双重类型断言吗';从百科全书样本中你不明白吗?

Typescript 有人能解释我不知道的双重类型断言吗';从百科全书样本中你不明白吗?,typescript,Typescript,data.js中的TypeScript Encyclopedia示例代码使用了一个似乎无法实现任何功能的双类型断言: export interface Group { key: string; title: string; } interface Groups { [idx: string]: Group; } var groupsHash = **<Groups>(<any>**{ recent: { key: 'recent', title

data.js中的TypeScript Encyclopedia示例代码使用了一个似乎无法实现任何功能的双类型断言:

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' }
});
导出接口组{
键:字符串;
标题:字符串;
}
接口组{
[idx:string]:组;
}
变量groupsHash=**(**{
最近:{key:'recent',title:'recent'},
收藏夹:{key:'favorites',title:'favorites'},
今天:{key:'today',title:'today'},
附近:{key:'xxnearest',title:'nearest'}
});
事实上,使用这些类型断言似乎使使用groupsHash变量变得更加困难,因为它向Intellisense添加了各种内容,而不是在没有这些类型断言的情况下会发生什么。有人能给我解释一下吗?谢谢

不需要
强制转换,也不会影响任何内容,因为对该对象的唯一引用是通过
groupHash
变量,编译器根据
强制转换推断该变量为
Groups
类型。我不确定为什么编写代码的人以这种方式编写代码,因为在我的尝试中,直接向组强制转换似乎工作得很好——也许代码是为需要它的早期版本的编译器编写的

话虽如此,我不知道你说“它向Intellisense添加了各种东西”是什么意思,因为编译器应该在groupHash上拥有的唯一类型信息是它引用了实现Groups接口的某个对象。当我在处理这段代码时,将中间角色转换为“any”没有任何区别。VS 2012 Express没有为groupHash提供自动完成功能,直到我在其上使用了括号属性访问符号和字符串键,此时它按预期列出了组的“键”和“标题”属性

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

之所以没有这样做,是因为“groupHash”的意思是用作哈希表——因此您可以在运行时动态添加和删除其中的属性。虽然您仍然可以这样使用它,而无需将其强制转换到Groups界面,但是您打算如何使用该对象的通信并不清楚。也就是说,新程序员查看代码,看到代码上有这4个属性,假设这个静态类型在程序的整个生命周期内都会保持不变,然后在运行时得到一个惊喜,当对象在添加和删除时突然看起来完全不同