在Typescript

时间:2018-05-15 17:54:55

标签: typescript

enter image description here

我有一段MessageTemplates的字典,我随着时间的推移而积累起来,我希望我能在TypeScript中导出一个类型,它代表悬挂的属性集关闭MessageTemplates结构,但它反对。

感觉我在做一些愚蠢的事情,但我一直在看这个太长时间不要问。

  

注意,我只是弄清楚,如果我使用 Class 结构 - 静态方法悬挂它 - 它确实有效,但我仍然困惑为什么普通对象文字语法不起作用。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是MessageTemplates,而不是类型keyof index type query operator会对该名称产生影响一个类型,而不是一个。一种用于区分差异的启发式方法是确定名称是否会出现在已编译的JavaScript中。如果它在运行时出现,它可能是一个值;如果没有,它可能是一种类型。在您的情况下,MessageTemplates将在运行时作为变量存在,因此它是一个值。

您要应用keyof的内容不是MessageTemplates,而是MessageTemplates值的类型。幸运的是,您可以使用typeof type query operator来获取值的类型。因此,对于名为typeof X的值,X将返回该值的类型。

(不要将其与runtime typeof operator混淆,其中typeof X会对名为X的值执行操作,并返回"number""boolean"之类的字符串在运行时。您可以从上下文中判断哪个是哪个。如果typeof将出现在已编译的JavaScript中,则它是运行时运算符。如果typeof是类型注释或声明的一部分并且获取在编译为JavaScript之前擦除它,它是类型查询运算符。对不起;对不同的东西使用相同的关键字令人困惑,但这就是它的方式。我想语言设计师更喜欢重复使用已保留的关键字,这样他们就不会破坏现有的JavaScript代码。或者他们认为让人们将所有这些警告添加到他们的解释中会很有趣。)

回顾一下:您不想要keyof MessageTemplates,但是" keyof MessageTemplates"的类型,是keyof (typeof MessageTemplates)。您可以删除括号:keyof typeof MessageTemplates

export type IMessageTemplateType = keyof typeof MessageTemplates
// type IMessageTemplateType = "upcomingUpload" | ...

希望有所帮助。祝你好运!