reactjs - 是否可以为事件处理程序推断useCallback的类型签名?

标签 reactjs typescript material-ui

我将React与TypeScript一起使用,并且将arrow函数用作Material UI <Select> component的回调:

import React from 'react';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';

interface Props {
  value: string;
  onSelect: (value: string) => void;
}

function MySelector(props: Props) {
  return (
    <Select
      value={props.value}
      onChange={e => props.onSelect(e.value as string)}
    >
      <MenuItem value="a">A</MenuItem>
      <MenuItem value="b">B</MenuItem>
      <MenuItem value="c">C</MenuItem>
    </Select>
  )
}

为了避免每次MySelector渲染时都传递新函数,我想使用 useCallback hook。尽管直接重构在运行时有效,但由于事件参数any上存在隐式e错误,它无法进行类型检查:
function MySelector(props: Props) {
  const handleChange = React.useCallback(
    e => props.onSelect(e.value as string),
 // ~ e implicitly has an any type
    [props.onSelect]
  );
  return (
    <Select
      value={props.value}
      onChange={handleChange}
    >
      { /* ... menu items ... */ }
    </Select>
  )
}

将鼠标悬停在原始的e符号上,其类型显示为
React.ChangeEvent<{
    name?: string | undefined;
    value: unknown;
}>

这很麻烦,但是要修复错误,这就是我要输入的内容:
const handleChange = React.useCallback(
  (
    e: React.ChangeEvent<{
      name?: string | undefined;
      value: unknown;
    }>,
  ) => props.onSelect(e.value as string),
  [props.onSelect],
);

我也可以吃蛋糕吗?我可以使用useCallback Hook ,仍然从上下文中获取事件参数的类型吗?

最佳答案

如果您仅使用事件中的value属性,则应该可以摆脱:

const handleChange = React.useCallback(
  (e: React.ChangeEvent<{value: string}>) => props.onSelect(e.value),
  [props.onSelect],
);

关于reactjs - 是否可以为事件处理程序推断useCallback的类型签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60219262/

相关文章:

javascript - 这在 javascript 函数中变为 null

reactjs - Material UI Typescript - createStyles 问题

reactjs - 将自定义 Prop 传递给 TypeScript 中的 Redux Form Field

javascript - React-native:从场景返回时调用函数

javascript - 从 API 在 React 中显示 Json 对象

javascript - react 路由器更改为具有不同参数的当前页面不起作用

typescript - 使用 typescript 在构造函数中动态设置类属性

reactjs - 在 Material-UI TextField 上禁用浏览器自动完成功能

reactjs - react | Material 用户界面|自动完成 |如何在 onNewRequest 中将 id 分配为值

javascript - 在 React.js 中调用外部组件方法的正确方法