reactjs - 有什么方法可以在反应打字稿项目中定义 addEventListener 和 classList 的类型
问题描述
在我们的项目(React with typescript)中,我们使用下面的代码来添加和操作导航栏中选项卡的下划线。
public componentDidMount() {
const tabs = document.getElementsByClassName("tab");
Array.prototype.forEach.call(tabs, (tab: EventListener) => {
tab.addEventListener("click", setActiveClass);
});
const setActiveClass = (event: any) => {
Array.prototype.forEach.call(tabs, (tab: any) => {
tab.classList.remove("active");
});
event.currentTarget.classList.add("active");
};
}.
打字稿抛出以下错误:
“[ts] Property 'addEventListener' does not exist on type 'EventListener'”和“[tslint] 'any' 的类型声明失去了类型安全性。考虑用更精确的类型替换它。(没有任何)”
我想添加适当的类型,而不是在代码中使用“任何”。我也不想放宽“任何”的 tslint 规则
任何帮助将非常感激。
谢谢
解决方案
使用call
本质上不是类型安全的。call 的定义基本上会在使用时删除任何函数类型信息any
:
call(this: Function, thisArg: any, ...argArray: any[]): any;
如果您forEach
作为普通实例函数调用,则将正确推断箭头函数的参数类型:
tabs.forEach(tab => {
tab.addEventListener("click", setActiveClass);
});
const setActiveClass = (event: Event) => {
tabs.forEach(tab => {
tab.classList.remove("active");
});
if(event.currentTarget != null){
(event.currentTarget as Element).classList.add("active");
}
};
推荐阅读
- visual-studio - 由于缺少可执行文件而导致 GDB 失败
- typescript - 如何使用 fp-ts Reader monad 制作单级管道/流?
- automation - 制定一个 Bamboo 计划会导致其他计划延迟安排
- node.js - 使用 Socket.io 从客户端向服务器发送消息数据是否可靠
- javascript - 动态组件内的自定义组件未初始化
- mysql - 选择关联表的所有行的数量并加入这些行。MySQL
- python - 检查 3D 点是否在基于正方形的金字塔中
- r - 如何在 r 中建立状态空间模型:将时变参数与 GARCH-M 模型相结合
- xslt - 有没有办法在 XSL 1.0 模板中使用 for 循环在以下场景中打印金额?
- blazor - 在自定义组件中包装 MudBlazor 组件 - @bind-Value 的问题