当前位置: 首页 > 知识库问答 >
问题:

前端 - 元素隐式具有 "any" 类型,因为类型为 "number" 的表达式不能用于索引类型 "MutableRefObject<[]>"?

赏彭薄
2024-08-19

创建了ref数组,为何使用的时候

//创建用于装ref的数组:
const ctlChildRefs = useRef<SubContainerImperativeRef[]>([]); // 多个子组件用数组装

...

//但是使用时候报错
ctlChildRefs[index]  

报错信息:
QQ_1723857921270.png

元素隐式具有 "any" 类型,因为类型为 "number" 的表达式不能用于索引类型 "MutableRefObject<SubContainerImperativeRef[]>"。
  在类型 "MutableRefObject<SubContainerImperativeRef[]>" 上找不到具有类型为 "number" 的参数的索引签名。ts(7053)

共有2个答案

马庆
2024-08-19

需要如下方式使用:

if(ctlChildRefs  && ctlChildRefs.current) {
    ctlChildRefs.current[index].doSomething()
}
蔚俊人
2024-08-19

在你的情况中,错误的原因是因为你错误地理解了useRef的使用方式。当你使用useRef<SubContainerImperativeRef[]>([])时,你实际上是在创建一个MutableRefObject<SubContainerImperativeRef[]>,这意味着ctlChildRefs.current是一个SubContainerImperativeRef[]数组,而不是ctlChildRefs本身。

因此,当你尝试通过索引访问ctlChildRefs[index]时,TypeScript 编译器会报错,因为它认为ctlChildRefs是一个MutableRefObject<SubContainerImperativeRef[]>,而不是一个数组,而MutableRefObject类型没有定义接受数字索引的索引签名。

正确的访问方式应该是通过ctlChildRefs.current[index]来访问数组中的元素。ctlChildRefs.current是实际的数组,你可以使用索引来访问其元素。

修改后的代码应该如下:

// 创建用于装ref的数组:
const ctlChildRefs = useRef<SubContainerImperativeRef[]>([]); // 多个子组件用数组装

// 使用时
const someElement = ctlChildRefs.current[index]; // 正确访问方式

这样,你就可以正确地访问到ctlChildRefs数组中的元素了。如果index在数组的有效范围内,这段代码就不会有问题。如果index可能超出数组范围,你可能还需要添加一些检查来避免运行时错误。

 类似资料:
  • 第二行提示 怎么解决这种提示问题,[]操作符既支持number,又支持string,要怎么设置?

  • 问题内容: 为React项目尝试TypeScript时,我陷入了这个错误: 当我尝试过滤组件中的数组时出现 到目前为止,我看了文章“ TypeScript中的索引对象”(https://dev.to/kingdaro/indexing-objects-in- typescript-1cgi ),因为它存在类似的错误,但是我尝试将索引签名添加到类型,我仍然收到相同的错误。 我的组件代码: 问题答案:

  • 如果我以通常的方式声明一个类,我可以使用类名作为类型: 但是,如果我通过将类表达式分配给变量来声明一个类,我就不能将该名称用作类型: 建议使用不起作用,因为我想要的实例类型,而不是类本身的类型。 typescript操场示例 如何获取以第二种方式定义的类的实例类型? 我对以这种方式定义类感兴趣的原因是,我希望有一个接口来描述某些类将具有的静态方法,如此处的手册中所述(该部分中的第三个示例)。 下面

  • 我正在尝试使用nifi将CSV记录插入Postgres数据库。 示例csv文件: 当nifi场景运行时,它会给出以下错误 错误列“timenow”的类型为timestamp,没有时区,但表达式的类型为character variating 如果我使用正常的 没有错误值插入到表中。我必须更改nifi配置才能将其添加到表中吗? 我换了Nifi CSVReader- 编辑:在第一条注释之后,Nifi生成

  • 我需要从这个xsd: 下面是我尝试的XML: 我得到了这个错误: 无效。错误-第10,9行:org.xml.sax.SAXParseException;行号:10;列号:9;cvc-complex-type.2.3:元素“group”不能具有字符[children],因为该类型的内容类型仅为元素。

  • 在Spring Boot的一个项目中,Java8使用hibernate-spatial和PostgresDB 9.4 应用程序属性 (我也尝试了PostgisPG9Dialect) 我的实体有一个属性 如果我用空值保存就可以了,但是如果我放一个值 我有: 在我的数据库中,我可以看到列定义为 我要疯了...为什么它不起作用? 更新(仍然不起作用,我正在收集新信息) 1)我认为问题可能是数据库的创建。