0

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' }
});

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

4

1 回答 1

2

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

话虽如此,当您说“它向 Intellisense 添加各种东西”时,我不确定您的意思,因为编译器在 groupHash 上应该拥有的唯一类型信息是它引用了一些实现 Groups 接口的对象。当我在玩这段代码时,将中间转换为“any”根本没有任何区别。VS 2012 Express 没有给我 groupHash 的自动补全功能,直到我使用带有字符串键的括号属性访问表示法,此时它按预期列出了 Group 的“key”和“title”属性。

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

没有这样做的原因是因为这个想法是“groupHash”旨在用作哈希表 - 因此您可以在运行时动态添加和删除属性。虽然您仍然可以以这种方式使用它而无需将其转换为 Groups 接口,但您打算如何使用该对象的沟通并不那么清楚。即,新程序员查看代码,看到它上面有这 4 个属性,假设这种静态类型将在程序的生命周期内得到维护,然后在运行时突然发现对象看起来完全不同,因为添加了东西并从中删除。

于 2012-10-16T02:54:52.547 回答