React Native TS报错:any类型无法索引MutableRefObject<never[]>
报错根因
报错由三个问题共同触发,仅修改items相关代码无法解决:
- 调用
useRef([])时未指定泛型类型,TypeScript会自动将ref的类型推导为MutableRefObject<never[]>,即该数组永远应为空,不允许写入任何类型的值 - 代码中直接使用
any类型的数组成员i作为索引操作ref对象,TS不允许any类型值索引类型约束严格的never数组 - 漏写了ref的访问规则:useRef返回的ref对象,内部存储的值必须通过
.current属性访问,直接给refs对象本身赋值本身就是错误用法
修复代码
import { useRef } from 'react'; // React Native场景下将HTMLDivElement替换为对应组件类型(如View),并从react-native导入对应组件 const Comp = (props: { items: (string | number)[] }) => { // 给useRef指定明确泛型,声明存储的是DOM/组件实例数组,初始值传空数组 const refs = useRef<(HTMLDivElement | null)[]>([]); return ( <> {props.items.map((item, index) => ( <div key={item} // 通过.current访问ref存储的数组,用map返回的index做索引更稳妥 ref={(el) => (refs.current[index] = el)} > {item} </div> ))} </> ); };
关键修改说明
- 显式声明
useRef的泛型类型,替换TS默认推导的never[]类型,允许数组存储指定类型的元素实例 - 所有对ref内部值的读写都必须通过
.current属性完成,直接操作ref对象本身不符合React ref的使用规则 - 优先使用
map方法返回的数组下标index作为ref数组的索引,避免当item为对象、布尔值等非合法数组索引时出现的隐式转换、ref覆盖问题 - 避免将入参
items声明为any[],明确item的具体类型可以从根源减少大部分隐式any类型报错
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

