reactjs - '(e: MediaQueryListEvent) => void' 类型的参数不可分配给'(e: Event) => void' 类型的参数
问题描述
我创建了以下挂钩来监听事件:
const useEventListener = (event: keyof WindowEventMap, callback: (e: Event) => void, element: EventTarget | null = window) => {
const callbackRef = useRef<(e: Event) => void>(callback)
useEffect(() => {
callbackRef.current = callback
}, [callback])
useEffect(() => {
const handler: EventListener = e => callbackRef.current(e);
element?.addEventListener(event, handler)
return () => element?.removeEventListener(event, handler)
}, [event, element])
}
现在我正在尝试创建一个监听媒体查询的钩子。但是,当我传递给callback: (e: Event) => void
以下函数时(e: MediaQueryListEvent) => setIsMatching(e.matches)
,我从打字稿中得到一个错误。从那以后我一直在挣扎MediaQueryListEvent extends Event
!我该如何解决?
const useMediaQuery = (mediaQuery: string) => {
const [isMatching, setIsMatching] = useState(false);
const [mediaQueryList, setMediaQueryList] = useState<MediaQueryList|null>(null);
useEffect(() => {
const list: MediaQueryList = window.matchMedia(mediaQuery)
setMediaQueryList(list)
setIsMatching(list.matches)
}, [mediaQuery])
# ERROR HERE
useEventListener("change", (e: MediaQueryListEvent) => setIsMatching(e.matches), mediaQueryList)
return isMatching;
}
完整错误:
Argument of type '(e: MediaQueryListEvent) => void' is not assignable to parameter of type '(e: Event) => void'.
Types of parameters 'e' and 'e' are incompatible.
Type 'Event' is missing the following properties from type 'MediaQueryListEvent': matches, media
解决方案
该错误对您正在努力解决的问题(“MediaQueryEvents extends Event”)非常有意义。 Event
缺少一些MediaQueryListEvents
具有 (matches
和media
) 的属性,因此 Typescript 会抱怨它。
如果你只使用你的钩子,你可以在你的钩子参数MediaQueryListEvents
中将类型从更改为e: Event
(可能需要从你正在使用的任何包中导入该类型定义)。如果您将使用各种不同的事件,则需要将其更改为,或使用管道运算符为(等) 设置多种可能的类型。e: MediaQueryListEvents
callback
e: any
e
e: Event | MediaQueryListEvents
推荐阅读
- typescript - 为什么这不是语法/编译时错误?
- windows - 如何在 Windows 机器上建立远程 UNIX 套接字
- python - pytest 模拟 MongoReplicaSetClient 对象的 .count() 和 .find() 函数
- .htaccess - 将查询字符串附加到 htaccess PDF 重定向 URL
- android - Android:程序类型已经存在:com.google.common.base.FinalizableReferencequeue
- python - 尝试将项目添加到python中的列表
- c# - WPF 页面不显示内容
- java - 在尝试运行我的应用程序时,我在下面收到此错误
- .net - Vb.net 如果不使用 10 分钟或 15 分钟,如何使您的应用程序进入睡眠状态
- python - sublabel 或 supylabel 或 subxlabel