我试图学习一些脚本教程,但我想让这个应用程序使用TypeScrip.

import PropTypes from 'prop-types';
import './button.scss'

const Button = (props: any | null | undefined) => {
  return (
    <button
      className={`btn ${props.className}`}
      onClick={props.onClick ? () => props.onClick() : null}
    >
      {props.children}
    </button>
  )
}

export const OutlineButton = (props:any | null | undefined) => {
  return (
    <Button
      className={`btn-outline ${props.className}`}
      onClick={props.onClick ? () => props.onClick() : null}
    >
      {props.children}
    </Button>
  )
}

Button.prototype = {
  onclick: PropTypes.func
}

export default Button

我在这个代码onClick={props.onClick ? () => props.onClick() : null}上有错误

上面写着

Type '(() => any) | null' is not assignable to type 'MouseEventHandler<HTMLButtonElement> | undefined'.
  Type 'null' is not assignable to type 'MouseEventHandler<HTMLButtonElement> | undefined'.ts(2322)
index.d.ts(1489, 9): The expected type comes from property 'onClick' which is declared here on type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'
(property) React.DOMAttributes<HTMLButtonElement>.onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined

你能帮我解决这个数据类型吗?

推荐答案

您可以根据props 对象是否包含onClick属性,有条件地将onClick函数传递给Button组件.下面是一个如何实现这一点的例子:

<div>
  {props.onClick ? (
    <Button onClick={props.onClick}>{props.children}</Button>
  ) : (
    <Button>{props.children}</Button>
  )}
</div>

我try 使用TypeScrip重构代码.

import React, { FC } from 'react';
import PropTypes from 'prop-types';
import './button.scss';

type ButtonProps = {
  className?: string;
  onClick?: () => void;
};

const Button: FC<ButtonProps> = ({ className, onClick, children }) => {
  const handleClick = () => {
    if (onClick) {
      onClick();
    }
  };

  return (
    <button className={`btn ${className}`} onClick={handleClick}>
      {children}
    </button>
  );
};

Button.propTypes = {
  onClick: PropTypes.func
};

export const OutlineButton: FC<ButtonProps> = ({ className, onClick, children }) => {
  const handleClick = () => {
    if (onClick) {
      onClick();
    }
  };

  return (
    <Button className={`btn-outline ${className}`} onClick={handleClick}>
      {children}
    </Button>
  );
};

export default Button;

Typescript相关问答推荐

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

防止获取发出不需要的请求

如何用不同的键值初始化角react 形式

为什么typescript要把这个空合并转换成三元?

带占位符的模板文字类型何时扩展另一个?

有条件地删除区分的联合类型中的属性的可选属性

使用Dockerfile运行Vite React应用程序时访问env变量

TS如何不立即将表达式转换为完全不可变?

在Reaction-Native-ReAnimated中不存在Animated.Value

在类型脚本中将泛型字符串数组转换为字符串字母并集

有没有可能创建一种类型,强制在TypeScrip中返回`tyPeof`语句?

重写返回任何

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

有没有一种方法可以防止我的组件包在其中安装样式组件'; node 模块中的s目录

断言同级为true或抛出错误的Typescript函数

具有枚举泛型类型的 Typescript 对象数组

如何确定剧作家中给定定位器的值?

在 next.js 13.4 中为react-email-editor使用forwardRef和next/dynamic的正确方法