我有一个 MessageTemplates
的字典,随着时间的推移我正在建立它,我希望我可以在 TypeScript 中导出一个 type 来表示属性集挂断 MessageTemplates
结构,但它反对。
感觉我在做一些愚蠢的事情,但我已经看这个太久了不问。
Note, I did just figure out that if I use a Class structure -- with static methods hanging off of it -- it does work but I'm still baffled why the plain object literal syntax doesn't work.
最佳答案
您遇到的问题是 MessageTemplates
是一个值,而不是一个类型,并且 keyof
index type query operator作用于类型 的名称,而不是值。判断差异的一种启发式方法是弄清楚名称是否会出现在编译的 JavaScript 中。如果它出现在运行时,它可能是一个值;如果不是,它可能是一种类型。在您的情况下,MessageTemplates
将在运行时作为变量存在,因此它是一个值。
您要将keyof
应用于的不是MessageTemplates
,而是MessageTemplates
值的类型。幸运的是,您可以使用 typeof
type query operator获取值的类型。因此,对于名为 X
的值,typeof X
会返回该值的类型。
(不要与 runtime typeof
operator 混淆,其中 typeof X
作用于名为 X
的值并返回类似 "number"的字符串
或 "boolean"
在运行时。您可以从上下文中判断哪个是哪个。如果 typeof
将出现在编译的 JavaScript 中,则它是运行时运算符。如果 typeof
是类型注释或声明的一部分,在编译为 JavaScript 之前被删除,它是类型查询运算符。对不起;对不同的事物使用相同的关键字会造成混淆,但事实就是如此。我猜语言设计者更喜欢重用已经保留的关键字,这样他们就不会最终破坏现有的 JavaScript 代码。或者他们认为让人们在他们的解释中添加所有这些警告很有趣。)
回顾一下:您不需要 keyof MessageTemplates
,而是“keyof
the type of MessageTemplates
” ,即 keyof (typeof MessageTemplates)
。您可以删除括号:keyof typeof MessageTemplates
:
export type IMessageTemplateType = keyof typeof MessageTemplates
// type IMessageTemplateType = "upcomingUpload" | ...
希望对您有所帮助。祝你好运!
https://stackoverflow.com/questions/50356506/
相关文章:
reactjs - 无法使用 axios 和 ReactJS 执行获取请求
python - 使用 bigquery tables GET api 获取表的最后修改日期
wordpress - 使用 AWS RDS 和我自己的数据库哪个最便宜?
java - Spring boot ConditionalOnBean 注解
regex - 为什么我不能在 clojure 中的 "|"拆分
intellij-idea - IntelliJ IDEA - 在路径中查找被锁定在另一个窗口监视器