reactjs - 带有 UseRef 的 Typescript 空闲计时器
问题描述
在放弃 Typescript 的边缘,一切似乎都变得更难了。尝试观看一个简单的 react-idle-timer 视频,几分钟后已经面临 Typescript 编译问题。在线搜索有关如何将 useRef 与 typescript 一起使用的指南说,在进行 useRef 调用时,只需将您期望的类型放在 <> 中。在纸上对我来说听起来不错并且应该可以工作,但是在这里我再次面临 TS 的问题。
import { useRef } from 'react';
import IdleTimer from 'react-idle-timer';
function IdleTimerContainer() {
const idleTimerRef = useRef<IdleTimer | null>(null);
function onIdle() {
console.log('user is idle');
}
return (
<div>
<IdleTimer timeout={5 * 1000} onIdle={onIdle} ref={idleTimerRef} />
</div>
);
}
export default IdleTimerContainer;
TS2769:没有重载匹配此调用。Overload 1 of 2, '(props: IdleTimerClassProps | Readonly): IdleTimer',给出了以下错误。类型 'MutableRefObject<IdleTimer | null>' 不可分配给类型 '(LegacyRef & ((ref: IdleTimer) => any)) | 不明确的'。类型 'MutableRefObject<IdleTimer | null>' 不可分配给类型 'RefObject & ((ref: IdleTimer) => any)'。类型 'MutableRefObject<IdleTimer | null>' 不能分配给类型 '(ref: IdleTimer) => any'。类型 'MutableRefObject<IdleTimer | null>' 不匹配签名 '(ref: IdleTimer): any'。Overload 2 of 2, '(props: IdleTimerClassProps, context: any): IdleTimer',给出了以下错误。键入“可变引用对象”< 空闲计时器 | null>' 不可分配给类型 '(LegacyRef & ((ref: IdleTimer) => any)) | 不明确的'。index.d.ts(143, 9):预期类型来自属性 'ref',它在此处声明类型为 'IntrinsicAttributes & IntrinsicClassAttributes & Readonly & Readonly<...>' index.d.ts(143, 9) :预期的类型来自属性 'ref',它在类型 'IntrinsicAttributes & IntrinsicClassAttributes & Readonly & Readonly<...>' 上声明
解决方案
这不是你的错!你的代码很好,是react-idle-timer
包本身做错了。
interface IdleTimerClassProps extends IdleTimerProps {
/**
* React reference to the IdleTimer Component instance.
*/
ref?: (ref: IdleTimer) => any
}
这部分源代码使您只能使用回调样式 ref 而不能使用 ref 对象。
您的 ref 对象应该只是一个 TS 问题,而不是 JS 问题,因此您可以使用as any
.
<IdleTimer timeout={5 * 1000} onIdle={onIdle} ref={idleTimerRef as any} />
您仍然可以在idleTimerRef
变量上使用正确的 TypeScript 类型。
推荐阅读
- undefined - TypeError:无法从未定义中读取属性“值”。(第 8 行,文件“代码”)
- reactjs - 材料大小按钮大小不可更改(反应)
- node.js - 开发中需要在“/static”前附加一个子目录
- asp.net - asp.net实体数据源性能问题
- c# - c# windows application Live Charts x轴日期格式
- c# - Entity Framework Core 3.0 - Include 中使用的 Lambda 表达式无效
- python - kafka-python消费者RecordTooLarge错误
- c++ - 为什么类的函数没有在主函数中被调用?
- node.js - npm i google 出现错误
- javascript - 如何在 node.js puppeteer 中输入表情符号?