请问老师关于ref的类型定义

来源:4-11 精益求精 - Buton 组件编码第二部分

hy_wang

2021-08-16

老师你好这里我把老师的button做了一个forwardRef的转发

import React, { forwardRef } from 'react';
import { ButtonSize, ButtonType } from './constant';
import classnames from 'classnames';

interface BaseButtonProps {
  children?: React.ReactNode;
  size?: ButtonSize;
  btnType?: ButtonType;
  disabled?: boolean;
  href?: string;
}

type NativeButtonProps = React.ButtonHTMLAttributes<HTMLElement> &
  BaseButtonProps;
type AnchorButtonProps = React.AnchorHTMLAttributes<HTMLElement> &
  BaseButtonProps;

export type ButtonProps = Partial<NativeButtonProps & AnchorButtonProps>;

const prefix = 'hy';

const Button: React.FC<ButtonProps> = forwardRef<
  HTMLButtonElement,
  ButtonProps
>((props, ref) => {
  const { className, btnType, disabled, size, children, href, ...restProps } =
    props;
  const classes = classnames(
    `${prefix}-btn`,
    `${prefix}-btn__${size}`, // 大小
    `${prefix}-btn__${btnType}`, // 类型
    { 'is-disabled': disabled }, // 是否禁用
    className // 用户自定义className
  );

  if (btnType === 'link') {
    return (
      <a className={classes} href={href} {...restProps}>
        {children}
      </a>
    );
  } else {
    return (
      <button ref={ref} className={classes} disabled={disabled} {...restProps}>
        {children}
      </button>
    );
  }
});

Button.defaultProps = {
  btnType: 'default',
  size: 'lg',
};

export default Button;

但是外层调用时候,ref属性TS会报错。我不清楚应该如何解决,我传递ref是第二个参数。难道我要写入buttonProps中定义吗

图片

写回答

1回答

张轩

2021-08-17

同学你好  将 

const Button:React.FC<ButtonProps>  这个定义删除,
让他自动推论成等号后面的类型,这样这个类型就有 ref 属性了。

// 初始化
const buttonRef = useRef<HTMLButtonElement>(null)
然后再赋值试试看


0
0

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2124 学习 · 959 问题

查看课程