diff --git a/package.json b/package.json index f83b14d9..fdfbe129 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@types/jest": "^25.2.3", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", + "@types/react-is": "^18.2.1", "@types/responselike": "^1.0.0", "@types/warning": "^3.0.0", "@umijs/fabric": "^3.0.0", diff --git a/src/ref.ts b/src/ref.ts index 26196ef6..c4efc982 100644 --- a/src/ref.ts +++ b/src/ref.ts @@ -1,7 +1,6 @@ /* eslint-disable no-param-reassign */ -import type * as React from 'react'; -import { isValidElement, ReactNode } from 'react'; -import { isFragment, isMemo } from 'react-is'; +import React from 'react'; +import { isForwardRef, isFragment, isMemo } from 'react-is'; import useMemo from './hooks/useMemo'; export function fillRef(ref: React.Ref, node: T) { @@ -37,11 +36,13 @@ export function useComposeRef(...refs: React.Ref[]): React.Ref { ); } -interface WithRef { - ref: React.Ref; -} - -export function supportRef(nodeOrComponent: any): nodeOrComponent is WithRef { +export function supportRef(nodeOrComponent: any) { + if (isFragment(nodeOrComponent)) { + return false; + } + if (isForwardRef(nodeOrComponent)) { + return true; + } const type = isMemo(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type; @@ -62,15 +63,9 @@ export function supportRef(nodeOrComponent: any): nodeOrComponent is WithRef { return true; } -export function supportNodeRef(node: ReactNode): boolean { - if (!isValidElement(node)) { +export function supportNodeRef(node: React.ReactNode) { + if (!React.isValidElement(node)) { return false; } - - if (isFragment(node)) { - return false; - } - return supportRef(node); } -/* eslint-enable */