ค้นหาเว็บไซต์

reactjs - JSX.Element ไม่สามารถกำหนดค่าให้กับพารามิเตอร์ชนิด ForwardRefRenderFunction ได้


ฉันพยายามส่งออก React แต่เจอข้อผิดพลาด TS นี้ซึ่งฉันไม่สามารถแก้ไขได้

นี่คือส่วนประกอบ:

import React, {
  useEffect,
  MutableRefObject,
  forwardRef,
  RefObject
} from 'react';
import styled from 'styled-components';

export interface TextareaInputProps
  extends React.HTMLAttributes<HTMLTextAreaElement> {
  text?: string;
  onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
  onApprove?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;
}

export interface StyledTextareaInputProps {
  ref: MutableRefObject<HTMLTextAreaElement | null>;
}

const StyledTextArea = styled.textarea<StyledTextareaInputProps>`
  display: flex;
  align-items: stretch;
  resize: none;
  flex: 1;
  padding: ${({ theme }) => theme.padding.md}px;
  color: ${({ theme }) => theme.colors.grey700};
  line-height: ${({ theme }) => theme.lineHeights.nm};
  font-family: ${({ theme }) => theme.fontFamilies.regular};
  font-size: ${({ theme }) => theme.fontSizes.nm}px;
  font-weight: ${({ theme }) => theme.fontWeights.regular};
  text-overflow: ellipsis;
  border-style: none;
  border-color: transparent;
  overflow: auto;
`;

const TextareaInput = (
  { text, onChange, onBlur, onKeyDown, ...otherProps }: TextareaInputProps,
  ref: RefObject<HTMLTextAreaElement>
) => {
  useEffect(() => {
    if (ref && ref.current) {
      ref.current.focus();
    }
  }, [ref]);
  return (
    <StyledTextArea
      ref={ref}
      {...otherProps}
      onChange={onChange}
      value={text}
      onBlur={onBlur}
      onKeyDown={onKeyDown}
    />
  );
};

export default forwardRef(TextareaInput);

นี่คือข้อผิดพลาดที่ฉันได้รับ:

อาร์กิวเมนต์ของชนิด ''({ text, onChange, onBlur, onKeyDown, ...otherProps }: TextareaInputProps, ref: React.RefObject) => JSX.Element'' ไม่สามารถกำหนดค่าให้กับพารามิเตอร์ชนิด ''ForwardRefRenderFunction<HTMLTextAreaElement, TextareaInputProps>'' ได้ ชนิดของพารามิเตอร์ ''ref'' และ ''ref'' ไม่เข้ากัน ชนิด ''MutableRefObject<HTMLTextAreaElement | null> | ((instance: HTMLTextAreaElement | null) => void) | null'' ไม่สามารถกำหนดค่าให้กับชนิด ''RefObject'' ได้ ชนิด ''null'' ไม่สามารถกำหนดค่าให้กับชนิด ''RefObject''.

ฉันมีส่วนประกอบอื่น ๆ ที่มีรูปแบบคล้ายกันซึ่งทั้งหมดทำงานได้

คำตอบ #1

ตามที่ข้อผิดพลาดบอก ให้เปลี่ยนคอมโพเนนต์ TextareaInput ของคุณเป็น ForwardRefRenderFunction โดยรวมถึงประเภทที่ถูกต้อง ลบประเภทออกจากพารามิเตอร์ (สิ่งนี้สำคัญเพราะคุณจะได้ข้อผิดพลาดอีกข้อหากไม่ทำ)

ฟังก์ชันที่อัปเดตของคุณจะมีลักษณะดังนี้ ทุกอย่างอื่นยังคงเหมือนเดิม:

const TextareaInput: ForwardRefRenderFunction<
  HTMLTextAreaElement,
  TextareaInputProps
> = (
  { text, onChange, onBlur, onKeyDown, ...otherProps },
  ref
) => {   
  useEffect(() => {
    if (ref && ref.current) {
      ref.current.focus();
    }
  }, [ref]);
  return (
    <StyledTextArea
      ref={ref}
      {...otherProps}
      onChange={onChange}
      value={text}
      onBlur={onBlur}
      onKeyDown={onKeyDown}
    />
  );
};

คำตอบ #2

ถ้าคุณอ่านเอกสารของ React เกี่ยวกับ forwardRef:

อาร์กิวเมนต์ ref ที่สองจะมีอยู่ก็ต่อเมื่อคุณกำหนดคอมโพเนนต์ด้วยการเรียก React.forwardRef ฟังก์ชันปกติหรือคอมโพเนนต์คลาสจะไม่ได้รับอาร์กิวเมนต์ ref และ ref ก็ไม่สามารถเข้าถึงได้จาก props เช่นกัน

คุณต้องทำอะไรบางอย่างแบบนี้:

const TextareaInput = (
  { text, onChange, onBlur, onKeyDown, ...otherProps }: TextareaInputProps,
  ref: RefObject<HTMLTextAreaElement>
) => {
  useEffect(() => {
    if (ref && ref.current) {
      ref.current.focus();
    }
  }, [ref]);
  return (
    <StyledTextArea
      ref={ref}
      {...otherProps}
      onChange={onChange}
      value={text}
      onBlur={onBlur}
      onKeyDown={onKeyDown}
    />
  );
};

สร้างอ้างอิงก่อน:

const ref = React.createRef();

การอ้างอิงรอบที่สองโดยใช้ forwardRef:

const ModifiedTextareaInput = React.forwardRef((props, ref) => <TextareaInput {...props} ref={ref}/>);
export default ModifiedTextareaInput;

หมายเหตุ: ฉันยังไม่ได้เพิ่มการกำหนดประเภทสำหรับสิ่งเหล่านั้น สมมติว่าคุณสามารถเพิ่มสิ่งเหล่านั้นได้

บทความที่เกี่ยวข้อง