正文从这开始~

总览

当我们不在事件处理函数中为事件声明类型时,会产生"Parameter 'event' implicitly has an 'any' type"错误。为了解决该错误,显示地为event参数声明类型。比如说,在input元素上,将处理change事件声明类型为React.ChangeEvent<HTMLInputElement>

这里有个示例用来展示错误是如何发生的。

// App.tsx

function App() {
// ️ Parameter 'event' implicitly has an 'any' type.ts(7006)
const handleChange = event => {
console.log(event.target.value);
console.log(event.target);
}; return (
<div>
<input onChange={handleChange} type="text" id="message" />
</div>
);
} export default App;

示例中的问题在于,我们没有显示地为事件处理函数的event参数声明类型。

设置类型

为了解决该错误,我们必须根据事件类型为参数设置一个类型。

// App.tsx

function App() {
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
console.log(event.target.value);
console.log(event.target);
}; return (
<div>
<input onChange={handleChange} type="text" id="message" />
</div>
);
} export default App;

我们将事件的类型声明为React.ChangeEvent<HTMLInputElement> ,因为我们正在为input元素声明一个onChange事件。

你要找出事件的类型,最简单的方法是将事件处理器内联编写,并将鼠标悬浮在函数的event参数上。

// App.tsx

function App() {
// ️ event is written inline
return (
<div>
<input
onChange={e => console.log(e.target.value)}
type="text"
id="message"
/>
</div>
);
} export default App;

截图显示,当我们将鼠标悬浮在内联事件处理器的e变量上时,我们得到了事件的正确类型。

这种方法适用于所有的事件处理器,一旦你知道了事件的正确类型,你就可以提取处理函数并正确对其类型声明。

下面是一个例子,说明如何用同样的方法确定onClick事件的类型。

// App.tsx

function App() {
// ️ event is written inline
return (
<div>
<button onClick={e => console.log(e)}>Click</button>
</div>
);
} export default App;

我们将鼠标悬浮在内联的e参数上,并发现其类型是什么。现在我们能够将事件处理程序提取到一个函数中。

// App.tsx

function App() {
const handleClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
console.log(e.target);
}; return (
<div>
<button onClick={handleClick}>Click</button>
</div>
);
} export default App;

现在事件的类型正确了。我们不会得到"Parameter 'event' implicitly has an 'any' type"错误。

逃生舱any

如果你不想正确地为事件声明类型,你只是想摆脱错误,那么可以将事件类型设置为any

// App.tsx

function App() {
// ️ explicitly set type to any
const handleClick = (e: any) => {
console.log(e.target);
}; return (
<div>
<button onClick={handleClick}>Click</button>
</div>
);
} export default App;

在TypeScript中,any类型可以有效地关闭类型检查。因此,我们现在可以在event上访问任何属性。

这样就解决了错误,因为现在事件被显式地设置为any类型,而之前是隐式地设置为any类型。

然而,一般来说我们最好避免使用any类型。

确定类型

下面是一个如何确定表form元素上的onSubmit事件类型的例子。

function App() {

  // ️ event written inline
return (
<div>
<form onSubmit={e => console.log(e)}></form>
</div>
);
} export default App;

我们将鼠标悬浮在内联的e参数上,发现提交事件应该类型声明为React.FormEvent<HTMLFormElement>

现在我们知道了正确的类型,我们就可以提取事件处理函数。

function App() {
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
console.log(event.target);
}; return (
<div>
<form onSubmit={handleSubmit}>
<input type="submit" value="Submit" />
</form>
</div>
);
} export default App;

这种方法适用于所有的事件处理器,一旦你知道了事件的正确类型,你就可以提取你的处理函数并正确地声明类型。

TypeScript总是能够推断出内联事件处理器的事件类型,因为你已经安装了React的类型定义文件。

# ️ with NPM
npm install --save-dev @types/react @types/react-dom # ---------------------------------------------- # ️ with YARN
yarn add @types/react @types/react-dom --dev

React报错之Parameter 'event' implicitly has an 'any' type的更多相关文章

  1. React报错之Parameter 'props' implicitly has an 'any' type

    正文从这开始~ 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an ...

  2. React报错之Property 'value' does not exist on type EventTarget

    正文从这开始~ 总览 当event参数的类型不正确时,会产生"Property 'value' does not exist on type EventTarget"错误.为了解决 ...

  3. React报错之Property 'X' does not exist on type 'HTMLElement'

    正文从这开始~ 总览 在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLEl ...

  4. React报错之Property 'value' does not exist on type 'HTMLElement'

    正文从这开始~ 总览 当我们试图访问一个类型为HTMLElement的元素上的value属性时,会产生"Property 'value' does not exist on type 'HT ...

  5. react 报错的堆栈处理

    react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...

  6. notification 报错the method build() is undefined for the type Notificatin.Builder

    notification 报错the method build() is undefined for the type Notificatin.Builder 这事api版本号太低导致的 Notifi ...

  7. react报错 TypeError: Cannot read property 'setState' of undefined

    代码如下: class test extends Component { constructor(props) { super(props); this.state = { liked: false ...

  8. React报错之Expected `onClick` listener to be a function

    正文从这开始~ 总览 当我们为元素的onClick属性传递一个值,但是该值却不是函数时,会产生"Expected onClick listener to be a function" ...

  9. MyBatis批量操作报错:Parameter 'xxxList' not found. Available parameters are [list]

    问题背景: 在Dao中使用MyBatis进行查询操作,参数是传的一个List:studentNameList,但是在执行查询的时候报错,具体日志如下: com.chenzhou.base.mybati ...

随机推荐

  1. Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    前言 在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方 ...

  2. C#中将string[] 转成 int[]的几种方法

    C#中将string[] 转成 int[]的方式有很多种. 直接遍历转换 这是最简单粗暴的方式.实例代码: 使用LINQ遍历 本质和直接遍历没多大差异,但代码量更少,代码更美观.实例代码: 注意:需要 ...

  3. Javaweb-Servlet学习

    1.Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个借口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个 ...

  4. 【摸鱼神器】UI库秒变低代码工具——表单篇(一)设计

    前面说了列表的低代码化的方法,本篇介绍一下表单的低代码化. 内容摘要 需求分析. 定义 interface. 定义表单控件的 props. 定义 json 文件. 基于 el-form 封装,实现依赖 ...

  5. python带你采集不可言说网站数据,并带你多重骚操作~

    前言 嗨喽,大佬们好鸭!这里是小熊猫~ 今天我们采集国内知名的shipin弹幕网站! 这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主. 大家可以在这里找到许多欢乐. 目录(可根据个人情况点击你 ...

  6. NC16539 [NOIP2013]表达式求值

    NC16539 [NOIP2013]表达式求值 题目 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 输入仅有一行,为需要你计算的表达式,表达式中只包含数字.加法运 ...

  7. 注意力机制最新综述:A Comprehensive Overview of the Developments in Attention Mechanism

    (零)注意力模型(Attention Model) 1)本质:[选择重要的部分],注意力权重的大小体现选择概率值,以非均匀的方式重点关注感兴趣的部分. 2)注意力机制已成为人工智能的一个重要概念,其在 ...

  8. go-zero微服务实战系列(十、分布式事务如何实现)

    在分布式应用场景中,分布式事务问题是不可回避的,在目前流行的微服务场景下更是如此.比如在我们的商城系统中,下单操作涉及创建订单和库存扣减操作两个操作,而订单服务和商品服务是两个独立的微服务,因为每个微 ...

  9. Nginx越界读取缓存漏洞 CVE-2017-7529

    1.漏洞描述 Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件.缓存的部分存储在文件中,每个缓存文件包括"文件头"+"HTTP返回包头" ...

  10. Tomcat深入浅出——最终章(六)

    前言 利用了六天的时间,对Tomcat的内容进行了整理. 学习不易.整理也不易,自己坚持的更了下来,很不错. 希望每一位在努力前行的小伙伴,都要相信坚持就会有收获. 本次Tomcat就探寻到这里,明年 ...