【发布时间】:2022-06-17 01:48:20
【问题描述】:
我有一个像这样的枚举:
export enum ApiFunctions {
"setHidden" = "HIDE",
"setReadOnly" = "SET_READ_ONLY",
"setVisible" = "SHOW",
"setDescription" = "SET_DESCRIPTION",
"setName" = "SET_NAME",
"makeRequest" = "MAKE_REQUEST"
}
今天早些时候,我从这个枚举中创建了一个新类型,如下所示:
export type ApiActions = Exclude<`${ApiFunctions}`, "MAKE_REQUEST">
此类型返回除“MAKE_REQUEST”(SET_DESCRIPTION,....)之外的所有键值
问题是模板文字类型是在 ts 4.1 上发布的,当前捆绑器的 ts 版本是 3.9.7,我无法真正更新它,因为它是外部提供的。
我尝试过复制这种类型:
export type Something = Exclude<typeof ApiFunctions[keyof typeof ApiFunctions], "MAKE_REQUEST">
但是这种类型并没有给我每个键SET_NAME | SET_DESCRIPTION ... 的实际字符串值,而是给了我ApiFunctions.setName | ApiFunctions.setDescription ... 行中的一些东西
有没有办法以任何其他方式实现由模板文字创建的完全相同的类型?
【问题讨论】:
-
这里的用例是什么?您将这些类型同时用作枚举和字符串文字类型似乎很奇怪;如果您选择一种用途并坚持使用它,您可以以一种直接的方式编写您的
ApiActions类型。 Observe here。这对您有用吗,还是出于某种原因您需要ApiFunctions成为枚举但ApiActions成为字符串文字的联合? -
这属于一个更广泛的公司项目,我无法真正深入了解,但基本上这些 API 函数属于一个 API,我们将其插入 iframe 以在某些事件发生时触发一些逻辑窗户。发出请求将触发 API 调用,但是。枚举背后的原因是后端的数据结构,但老实说,如果不超过我们目前使用的建议,您的建议也同样有意义。
-
所以你想让我把它写下来作为答案吗?我认为所问问题的答案是“不,在 TS4.1 之前,没有办法将字符串枚举类型扩展到其相应的字符串文字”,但更有用的方法是坚持使用枚举(并查看字符串值对 TS 代码不透明)或字符串文字。让我知道我应该如何进行。
-
您可以继续添加它作为答案,因为您所说的完全有道理,尽管不是正确答案,但您提出了具有有效论证的不同解决方案
标签: javascript typescript types bundler template-literals