【问题标题】:Building a type off keys of a const in Typescript在 Typescript 中构建 const 的类型键
【发布时间】:2023-04-01 13:36:01
【问题描述】:

我有一本 MessageTemplates 的字典,随着时间的推移我正在建立它,我希望我可以在 TypeScript 中导出一个 type,它代表挂在 @987654324 上的一组属性@ 结构,但它反对。

感觉好像我在做一些愚蠢的事情,但我已经看这个太久没有问了。

注意,我刚刚发现,如果我使用 Class 结构——其中挂着静态方法——它确实可以工作,但我仍然对为什么普通的对象字面量语法感到困惑不工作。

【问题讨论】:

  • MessageTemplates 是一个值,而不是一个类型。你想要keyof typeof MessageTemplates
  • 啊,是的。该死的希望我能理解这一点,但几乎同样高兴你在那里为我指明了正确的方向。 ????如果你写作为一个答案,我很高兴给你信用。

标签: typescript


【解决方案1】:

您遇到的问题是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,而是“keyofMessageTemplates的类型”,即keyof (typeof MessageTemplates)。可以去掉括号:keyof typeof MessageTemplates:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2019-04-05
    • 2021-08-23
    • 2019-10-19
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多