2

类型'{焦点():无效;}' 缺少类型“HTMLDivElement”的以下属性:align、addEventListener、removeEventListener、accessKey 和 234 more.ts(2740) index.d.ts(1041, 79):预期类型来自 this 的返回类型签名。

这是组件代码:

import React, { forwardRef, useImperativeHandle, useRef } from "react";

type Ref = HTMLDivElement | null;
type SwiperProps = {
  children?: React.ReactNode | null;
  selectedIndex?: number;
};

const Swiper = forwardRef<Ref, SwiperProps>(
  ({ children = null }: SwiperProps, ref) => {
    const inputRef = useRef(null);
    useImperativeHandle(ref, () => ({
      focus() {
        inputRef.current.focus();
      }
    }));
    return (
      <div ref={ref}>
        {children}
        <input type="text" ref={inputRef} />
      </div>
    );
  }
);

export default Swiper;

完整代码在代码沙箱中;

https://codesandbox.io/s/useimperativehandlecomponenterror-lowon

4

1 回答 1

8

您混淆了您的 refs 的类型定义:

import React, { forwardRef, useImperativeHandle, useRef } from "react";

type Ref = {
  focus: () => void
} | null;
type SwiperProps = {
  children?: React.ReactNode | null;
  selectedIndex?: number;
};

const Swiper = forwardRef<Ref, SwiperProps>(
  ({ children = null }: SwiperProps, ref) => {
    const inputRef = useRef<HTMLInputElement>(null);
    useImperativeHandle(ref, () => ({
      focus() {
        inputRef.current?.focus();
      }
    }));
    return (
      <div>
        {children}
        <input type="text" ref={inputRef} />
      </div>
    );
  }
);

export default Swiper;

您公开的类型应该描述您的命令句柄。

编辑 useImperativeHandleComponentError (forked)

于 2020-12-15T07:58:34.310 回答