重载与 useRef 不匹配

Posted

技术标签:

【中文标题】重载与 useRef 不匹配【英文标题】:Overloads don't match on useRef 【发布时间】:2020-11-29 07:34:27 【问题描述】:

重载不匹配

import React,  useEffect, useState, useRef  from 'react'


function Button() 

  const [ctr, setCtr] = useState(0)
  let interval = useRef<NodeJS.Timeout | null>(null)

  useEffect(() => 
    interval.current = setInterval(() => 
      setCtr(prev => prev + 1)
    ,1000)
    return () => 
      clearInterval(interval.current)
    
  , [])
  
 
  return (
    <>
      <span> Count : ctr </span>
      <button onClick= () => clearInterval(interval.current) > Clear </button>
    </>
  )


export default Button

错误:

No overload matches this call.
  Overload 1 of 2, '(intervalId: Timeout): void', gave the following error.
    Argument of type 'Timeout | null' is not assignable to parameter of type 'Timeout'.
      Type 'null' is not assignable to type 'Timeout'.
  Overload 2 of 2, '(handle?: number | undefined): void', gave the following error.
    Argument of type 'Timeout | null' is not assignable to parameter of type 'number | undefined'.
      Type 'null' is not assignable to type 'number | undefined'.ts(2769)

图片:

【问题讨论】:

【参考方案1】:

您需要从interval.current 类型中排除null

<button onClick= () => clearInterval(interval.current as Timeout) > Clear </button>

【讨论】:

【参考方案2】:

我忘记了 setInterval 是一个窗口对象。这里的问题是 TS 认为这是一个 NodeJS 构造,而它只是一个窗口函数。使用 as 关键字不是好的做法,在大多数情况下应避免使用。 typescript 的重点在于它是强类型的,as 的用法与此不同。

function Button() 

  const [ctr, setCtr] = useState(0)
  const interval = useRef(0);
  useEffect(() => 
    interval.current = window.setInterval(() => 
      setCtr(prev=>prev+1)
    , 1000);

    return () => 
      window.clearInterval(interval.current);
    ;
  , []);
  
 
  return (
    <>
      <span> Count : ctr </span>
      <button onClick= () => window.clearInterval(interval.current) > Clear </button>
    </>
  )

【讨论】:

以上是关于重载与 useRef 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

swift 3 错误:参数标签 '(_:)' 与 UICollectionViewLayout 上的任何可用重载都不匹配(旋转轮)

参数标签'(stringInterpolationSegment :)'与任何可用的重载都不匹配

重载函数的参数匹配与转换

参数标签 '(URL:)' 不匹配任何可用的重载

没有重载函数“AfxBeginThread”的实例与参数列表匹配

参数标签 '(collectionviewlayout:)' 不匹配任何可用的重载