如何克服Typescript中使用动态枚举器(上限量词数)枚举类型的TS2589

如何克服Typescript中使用动态枚举器(上限量词数)枚举类型的TS2589,typescript,Typescript,通过查看,我找到了创建范围和枚举的类型 查看后,我发现了一个类型定义,用于将枚举作为值传递给函数 现在: 我正在写一个lil UI/UX库,这是我的爱好项目。 在这样做的同时,四处玩耍,努力把事情做好。。。 我试图引入以下机制: 我想创建如下枚举: 导出枚举EInputInteractionState{ 默认值为0, 悬停=1, 焦点=2, 活动=4, 所选=8, } 现在,将定义状态的组合状态也包含在内是可能的,有时也是有用的,例如,一些列表元素可能是: 盘旋 精选 同时,。 为了能够将所

通过查看,我找到了创建范围和枚举的类型

查看后,我发现了一个类型定义,用于将枚举作为值传递给函数

现在: 我正在写一个lil UI/UX库,这是我的爱好项目。 在这样做的同时,四处玩耍,努力把事情做好。。。 我试图引入以下机制:

我想创建如下枚举:

导出枚举EInputInteractionState{
默认值为0,
悬停=1,
焦点=2,
活动=4,
所选=8,
}
现在,将定义状态的组合状态也包含在内是可能的,有时也是有用的,例如,一些列表元素可能是:

  • 盘旋
  • 精选 同时,。 为了能够将所有数据保存在一个var/number中,我将初始键/值定义为
    v=0,2^n。。。(==0,1,2,4,8,16,…)
    这将允许我将每一个置换组合状态保存为一个数字,它是它的活动定义状态的总和。。。这个数字总是会填补二次行数字之间的空白。。。。 因此,基本上,虽然我在EInputInteractionState中定义了5个状态(=默认状态,加上4个组合状态),并将它们定义为
    v=0,2^n
    ,但总体组合上可能的值将是表示
    v=0,1,2,3。。。N(n*2-1)
    =(n*(n+1)/2)`
利用目前的知识,我做到了:

export const gaussianSum=(E:T):number=>{
让length=Object.keys(E).filter(v=>isNaN(v为未知)).length;
返回长度*(长度+1)/2+1;
}
现在我想最后简单地将一个道具放入我的反应组件IProps中:

const permutationCount: number = gaussianSum(EInputInteractionState);

interface IProps {
  icon?: TIcon | TIcon[]
  state?: Enumerate<typeof permutationCount>,
}
const置换计数:number=gaussianSum(EInputInteractionState);
接口IProps{
图标?:TIcon | TIcon[]
州:列举,
}
然而,如果我简单地给出一个具体的数字,Enumarte类型工作得很好,但是使用这个场景,我得到了TS2589“类型实例化太深了,可能是无限的。”

有没有办法解决这个问题

编辑: 此处键入脚本:

例如,您可以从更新您的
枚举内部类型开始:

type EnumerateInternal=N扩展了['length']?A:是的
但情况可能并非如此

您的
Enumerate
类型util应该只接受文字数字

例如,如果您编写:

类型结果=枚举
这会奏效的

它也适用于
枚举
,但也不适用于
44

但为什么只有43岁

因为它会产生从0到42的数字(生命的意义)

所以TS有一些递归限制

如果要使用函数的返回类型,则不应写入:

枚举
相反,你应该写:

枚举

另外,使用
Number.isNaN
比使用
isNaN

安全得多。为什么要将
EInputInteractionState
作为函数的参数传递?您的代码缺少某些类型,因此我无法使其在沙箱中工作。无论如何,请给我发一个最低限度的工作示例,虽然我理解你提出的组合状态计算是如何工作的,但我不明白你为什么要做这样的事情。似乎不必要的抽象和过度,除非你的全部要点是玩这样一个系统,考虑一个不同的方法。我在一个编辑@ jeld:添加了游戏场)你的问题是在<代码>枚举内的< /代码>类型。你应该在某些条件下包装你的递归。首先:thx代表数字。isNaN提示!!!第二:好笑话!哈哈,Main:Thx表示Typescript有递归限制。在我将这个答案标记为已接受之前,如果有人提出了什么,我会等待:)请注意,我不是编写这些类型定义的TS专家,它们来自问题开头提到的stackoverflow问题。我想我只能靠自己:)@Joehannes当然,没问题)也许smbd会想出更好的解释和解决方案。我也很乐意读