Scrypt中使用FixedArray<ByteString,1000>报错:类型实例化过深
解决FixedArray<ByteString,1000>类型实例化过深问题
问题重现
在智能合约相关的TypeScript代码中声明固定长度数组时触发错误:
Type instantiation is excessively deep and possibly infinite
代码示例:
let tokenid: FixedArray<ByteString,1000>;
解答
是否可以使用该类型?
可以使用,但直接指定长度为1000会触发TypeScript的类型递归深度限制——因为FixedArray的底层实现是通过递归嵌套的方式构建固定长度的类型结构,当数值过大时,递归层级会超出TypeScript的处理上限,从而抛出上述错误。
正确用法
优先使用动态数组(推荐)
如果业务逻辑不需要强制编译时固定长度校验,直接改用动态数组即可避免该问题,运行时可自行控制数组长度:let tokenid: ByteString[];拆分固定长度数组为二维结构
若必须保留编译时固定长度的约束,可将大长度拆分为多层嵌套的小长度数组,降低单层级的递归深度:// 将1000拆分为10组,每组100个元素 type TokenIdArray = FixedArray<FixedArray<ByteString, 100>, 10>; let tokenid: TokenIdArray;运行时补充长度校验
也可以使用readonly ByteString[]作为类型,配合运行时的长度检查来模拟固定长度数组的约束,这种方式不会触发类型递归问题:let tokenid: readonly ByteString[]; // 运行时校验长度 if (tokenid.length !== 1000) { throw new Error("tokenid数组长度必须为1000"); }
内容的提问来源于stack exchange,提问作者mpapec
相关产品推荐
相关产品推荐

