wizarddos
wizarddos

Reputation: 187

How to pass function as a prop in react typescript

I am learning typescript with react and I occurred problem. I tried to pass function as a prop from my App component to child component named DataForm.

but I got an error:

Type '(f: any) => any' is not assignable to type '() => void'.
Parameter 'f' implicitly has an 'any' type.

And this is my code

App.tsx

import React from 'react';
import './App.css';
import DataForm from './components/form';

export const Data = {
  name: "",
  country: "",
  age:"",
  adress:""
}

function App() {


  const generateCard = ()=>{
    console.log(" generateCard runned")
  }
  return (
    <>
      <h1>Human Card Generator</h1>
      <DataForm  createCard = { generateCard }/>
    </>
    

  );
}

export default App;

components/form.tsx

import React from 'react'
import { Data } from '../App'
import 'bootstrap';

interface dataFormProps{
    createCard: ()=>void
}

export default function DataForm({ createCard = f => f }: dataFormProps){

    const dataProceed = (e: any) =>{
        Data.name = (document.getElementById('name') as HTMLInputElement).value;
        Data.country = (document.getElementById('country') as HTMLInputElement).value;
        Data.age = (document.getElementById('age') as HTMLInputElement).value;
        Data.adress = (document.getElementById('adress') as HTMLInputElement).value;
        createCard();
    }


    return(
        <form onSubmit = { dataProceed }>
            <input type="text"   id = "name"  />
            <input type="text"  id = "country" />
            <input type="number" id="age" />
            <input type="text" id = "adress"/>
            <button type="submit">stwórz kartę</button>
        </form>
    )
}

Upvotes: 12

Views: 61198

Answers (2)

David
David

Reputation: 218808

The issue isn't when passing the function, it's when destructuring the props and providing a default function:

{ createCard = f => f }: dataFormProps

This code indicates that createCard should be a function which accepts a parameter and returns a value. Which it doesn't:

createCard: ()=>void

Make the default parameter match the signature:

{ createCard = () => {} }: dataFormProps

Upvotes: 16

Viet
Viet

Reputation: 12777

default function createCard should has type () => void. So just update like this:

DataForm({ createCard = () => {} }: dataFormProps)

Upvotes: 6

Related Questions