gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:16:31 25 4
gpt4 key购买 nike

enter image description here

我有一个 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" | ...

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

关于typescript - 在 Typescript 中构建 const 键的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com