typescript - 在 Typescript 中构建 const 键的类型

我有一个 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 注解

python - 如何永远运行异步函数(Python)

android - 使用限制查询 Firebase 数据库

regex - 为什么我不能在 clojure 中的 "|"拆分

intellij-idea - IntelliJ IDEA - 在路径中查找被锁定在另一个窗口监视器

apache-spark - Spark UI 中的 "red"executors 是什么意思?

ansible - 例如,如何限制 Ansible 的设置模块 (gather_facts) 仅检索