Home > other >  Getting "This expression is not callable" in Typescript React Application
Getting "This expression is not callable" in Typescript React Application

Time:07-06

I'm trying to separate my logic from my layout component in a Typescript React Application, but I think there's something wrong with the return type of my controller return object.

I tried the following to make a type which indicates which is the return type but typescript is complaining

controller.tsx, here i got:

TS2322: Type '() => { iconsList: floatingNavbarItem[]; value: string; handleChange: (event: SyntheticEvent, newValue: string) => void; }' is not assignable to type 'ControllerFN'.

type ControllerFN = {
    iconsList: floatingNavbarItem[];
    value: string;
    // eslint-disable-next-line no-unused-vars
    handleChange: (event: SyntheticEvent, newValue: string) => void;
};

const floatingNavbarController: ControllerFN = () => {
  const [value, setValue] = useState('addPlan');

  const handleChange = (event: SyntheticEvent, newValue: string) => {
    setValue(newValue);
  };

  const iconsList:floatingNavbarItem[] = useMemo(
    () => [
      {
        value: 'addPlan',
        label: 'addPlan',
        icon: <FontAwesomeIcon icon={faCirclePlus} />,
      },
    ],
    [],
  );

  return { iconsList, value, handleChange };
};

floatingNavbar.jsx

const FloatingNavbar: FunctionComponent = () => {
  const { iconsList, value, handleChange } = floatingNavbarController();
  return (
    <Navbar
      value={value}
      onChange={handleChange}
    >
      <FloatingNavbarItem iconsList={iconsList} />
    </Navbar>
  );
};

Here I got:

TS2349: This expression is not callable.   Type 'ControllerFN' has no call signatures.

when I call floatingNavbarController(); at line 2

and

TS2322: Type '{ iconsList: any; }' is not assignable to type 'IntrinsicAttributes & floatingNavbarItem[]'.   Property 'iconsList' does not exist on type 'IntrinsicAttributes & floatingNavbarItem[]'.

at props iconsList at line 8

What am I doing wrong? Any ideas?

CodePudding user response:

By writing const floatingNavbarController: ControllerFN, you're saying that the variable floatingNavbarController has the type ControllerFN.

But that's not true - floatingNavbarController is a function that returns ControllerFN.

I think what you're looking for is this:

type ControllerFN = () => {
    iconsList: floatingNavbarItem[];
    value: string;
    // eslint-disable-next-line no-unused-vars
    handleChange: (event: SyntheticEvent, newValue: string) => void;
};

const floatingNavbarController: ControllerFN = () => {
// ...
  • Related