TypeScript如何修复unknown类型不能用作索引类型的报错
报错原因
你遇到的类型报错是因为randomUniqueDenominators方法中创建的Set没有声明泛型类型,TypeScript无法推断出Set内存储的值是number类型的数组索引,默认会将Set元素判定为unknown类型,而数组索引仅支持number、string、symbol类型,因此会抛出type unknown cannot be used as an index type错误。
修复方案
方案1:从方法源头完善类型(推荐)
给Set添加number泛型声明,同时明确方法的返回值类型为Set<number>,这样TypeScript可以自动推断后续转换得到的数组元素为number类型,你的原有业务代码不需要额外修改即可正常运行:
static randomUniqueDenominators(denominators: number[], count: number): Set<number> { // 声明Set存储的元素为number类型 let nums = new Set<number>(); let numerator = 0; while (nums.size < count) { numerator = Math.floor(Math.random() * denominators.length); nums.add(numerator); } return nums; }
方案2:直接遍历Set(可选优化)
ES6+的Set本身是可迭代对象,不需要转成数组也可以直接遍历,能省一步转换操作:
const chosenDenominatorSet = MyLogic.randomUniqueDenominators(denominators, 3); for (const index of chosenDenominatorSet) { console.log(denominators[index]) }
临时应急方案
如果暂时不方便修改方法定义,可以用类型断言手动指定元素类型,仅作为临时方案使用,不推荐长期依赖:
console.log(denominators[chosenDenominators[i] as number])
内容的提问来源于stack exchange,提问作者Amine
相关产品推荐
相关产品推荐

