Reputation: 187
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
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
Reputation: 12777
default function createCard
should has type () => void
. So just update like this:
DataForm({ createCard = () => {} }: dataFormProps)
Upvotes: 6