React中使用TS+useImperativeHandle

在React中配合TS是最常见不过的事了,不过最近我在练习useImperativeHandle这个Hooks的时候,发现官网用的JS讲解的这个Hooks,而在TS中则会报这样的错。

Property 'setValue' does not exist on type 'never'.

在React的官方文档关于这个Hooks的用例介绍用的是JS,所以我们也没办法通过查阅官方文档来解决这个问题。

image.png

很多同学为了解决这个报错会使用any,将TypeScript用为anyScript,那这样的话使用TypeScript的意义就没有了,无法确保类型安全,也有同学会使用 // @ts-ignore去消除错误,这样的做法我比较不推荐的。

其实消除这个类型报错的方法很简单,我们点进forwardRef中看看类型。

image.png 接着,我们点进这个函数类型看看,ref和props的类型传参顺序。

image.png 通过这里我们就可以看出,forwardRef函数的类型传参,第一个参数为ref的类型参数,第二个参数为props的类型参数,接下来我们就只需要准备ref的类型即可。

ref的类型根据useImperativeHandle这个Hoos返回的函数指定,例如:


//父组件
'use client'

import { useRef } from "react"
import User from "./user/page"
import { Ref } from "./user/page"
export default function Home() {
  const inputRef=useRef<Ref>(null)
  function set(){
    if(inputRef.current===null){
      return;
    }
    inputRef.current.setValue()
  }
  return (
    <div className=' text-red-600'>
        index pages
        <User ref={inputRef}/>
        <button onClick={set}>点击</button>
    </div>
  )
}

//子组件
'use client'

import React, { useImperativeHandle,forwardRef,useRef } from 'react'

type Props={
    
}

export interface Ref {
    setValue:()=>void,

}

const User=forwardRef<Ref,Props>(function User(props:Props,ref) {
    const inputRef=useRef<HTMLInputElement>(null)
    useImperativeHandle(ref,()=>{
        return{
            setValue(){
                if(inputRef.current===null){
                    return
                }
                inputRef.current.value="1in"
            }
        }
    },[])
    return (
      <div>
          user 
          <input type="text" ref={inputRef} />
      </div>
    )
  })

export default User

在上述代码中,因为我的返回值只有setValue这个函数,所以我们ref的类型只需要声明setValue这个函数的类型即可。

注:因为我在Next.js中编写的代码,所以会有最开始的"use client",如果你在React中编写,最开始的"use client"可以忽略

全部评论

相关推荐

09-11 10:30
门头沟学院 C++
隔壁刷到的,请问几年前真的是这样吗
智能搬砖:21年已经有点难了,后面越来越难,主要是入行的卷王太多了,前几年培训机构搞宣传火了一波,像张雪峰有两年都在推计算机,进去的几百万卷王还没毕业呢,起码还要再卷五六年,到时候估计大厂就只要985了,211也得来跟我们卷外包了😂
我的秋招日记
点赞 评论 收藏
分享
08-23 21:29
已编辑
吉林师范大学 硬件开发
牛马人的牛马人生:前期急啥 前期神仙打架高端局ssp的高级大offer 都是佬们的战争
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务