我有一段MessageTemplates
的字典,我随着时间的推移而积累起来,我希望我能在TypeScript中导出一个类型,它代表悬挂的属性集关闭MessageTemplates
结构,但它反对。
感觉我在做一些愚蠢的事情,但我一直在看这个太长时间不要问。
注意,我只是弄清楚,如果我使用 Class 结构 - 静态方法悬挂它 - 它确实有效,但我仍然困惑为什么普通对象文字语法不起作用。
答案 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" | ...
希望有所帮助。祝你好运!