如何克服Typescript中使用动态枚举器(上限量词数)枚举类型的TS2589
通过查看,我找到了创建范围和枚举的类型 查看后,我发现了一个类型定义,用于将枚举作为值传递给函数 现在: 我正在写一个lil UI/UX库,这是我的爱好项目。 在这样做的同时,四处玩耍,努力把事情做好。。。 我试图引入以下机制: 我想创建如下枚举:如何克服Typescript中使用动态枚举器(上限量词数)枚举类型的TS2589,typescript,Typescript,通过查看,我找到了创建范围和枚举的类型 查看后,我发现了一个类型定义,用于将枚举作为值传递给函数 现在: 我正在写一个lil UI/UX库,这是我的爱好项目。 在这样做的同时,四处玩耍,努力把事情做好。。。 我试图引入以下机制: 我想创建如下枚举: 导出枚举EInputInteractionState{ 默认值为0, 悬停=1, 焦点=2, 活动=4, 所选=8, } 现在,将定义状态的组合状态也包含在内是可能的,有时也是有用的,例如,一些列表元素可能是: 盘旋 精选 同时,。 为了能够将所
导出枚举EInputInteractionState{
默认值为0,
悬停=1,
焦点=2,
活动=4,
所选=8,
}
现在,将定义状态的组合状态也包含在内是可能的,有时也是有用的,例如,一些列表元素可能是:
- 盘旋
- 精选
同时,。
为了能够将所有数据保存在一个var/number中,我将初始键/值定义为
这将允许我将每一个置换组合状态保存为一个数字,它是它的活动定义状态的总和。。。这个数字总是会填补二次行数字之间的空白。。。。 因此,基本上,虽然我在EInputInteractionState中定义了5个状态(=默认状态,加上4个组合状态),并将它们定义为v=0,2^n。。。(==0,1,2,4,8,16,…)
,但总体组合上可能的值将是表示v=0,2^n
=(n*(n+1)/2)`v=0,1,2,3。。。N(n*2-1)
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会想出更好的解释和解决方案。我也很乐意读