Skip to main content

isFunctionComponent

Determines whether a given value is a React functional component. Identifies functional components by checking if the value is a function that lacks the isReactComponent prototype property (which distinguishes it from class components). This includes standard function components and arrow function components, but excludes components created with forwardRef (which are objects).

Signature

const isFunctionComponent: <Props extends object = any, Component extends FC<Props> = FC<Props>>(component: unknown) => component is Component

Parameters

NameTypeDescription
component-The value to inspect for functional component characteristics

Returns

Type-safe boolean indicating whether the value is a functional component

Examples

Basic functional component detection

import React, { Component, forwardRef } from 'react';
import { isFunctionComponent } from '@winglet/react-utils';

// Standard function component
function MyFunctionComponent() {
return <div>Hello World</div>;
}

// Arrow function component
const MyArrowComponent = () => <div>Hello World</div>;

// Class component
class MyClassComponent extends Component {
render() { return <div>Hello World</div>; }
}

console.log(isFunctionComponent(MyFunctionComponent)); // true
console.log(isFunctionComponent(MyArrowComponent)); // true
console.log(isFunctionComponent(MyClassComponent)); // false

With forwardRef components

const ForwardedComponent = forwardRef<HTMLDivElement, Props>((props, ref) => {
return <div ref={ref}>Content</div>;
});

console.log(isFunctionComponent(ForwardedComponent)); // false

TypeScript type inference

interface Props {
message: string;
}

const TypedComponent: FC<Props> = ({ message }) => <span>{message}</span>;

if (isFunctionComponent<Props>(someComponent)) {
// TypeScript knows someComponent is FC<Props>
const element = someComponent({ message: 'Hello' });
}

Playground

import React, { Component, forwardRef } from 'react';
import { isFunctionComponent } from '@winglet/react-utils';

// Standard function component
function MyFunctionComponent() {
return <div>Hello World</div>;
}

// Arrow function component
const MyArrowComponent = () => <div>Hello World</div>;

// Class component
class MyClassComponent extends Component {
render() { return <div>Hello World</div>; }
}

console.log(isFunctionComponent(MyFunctionComponent)); // true
console.log(isFunctionComponent(MyArrowComponent)); // true
console.log(isFunctionComponent(MyClassComponent)); // false

Notes

This function identifies functional components by:

  • Verifying the value is a function
  • Ensuring it lacks the prototype.isReactComponent property

Note that this will return true for:

  • Standard function declarations
  • Arrow function expressions
  • Any function without the React class component marker

And false for:

  • Class components (they have prototype.isReactComponent)
  • Memoized components (they're objects, not functions)
  • Components created with React.forwardRef (they're objects, not functions)
  • Non-function values