我正在用react学习打字,我遇到了问题。我试图将函数作为道具从我的应用程序组件传递给名为DataForm的子组件。
但是我得到了一个错误:
这是我的代码Type '(f: any) =>任何'不能赋值给type '() =>无效"。
参数'f'隐式具有'any'类型。
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;
组件/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>
)
}
问题不在于传递函数,而在于解构props并提供默认函数:
{ createCard = f => f }: dataFormProps
这段代码表明createCard
应该是一个接受参数并返回值的函数。它没有:
createCard: ()=>void
使默认参数匹配签名:
{ createCard = () => {} }: dataFormProps
默认功能createCard
的类型应为() => void
。所以像这样更新:
DataForm({ createCard = () => {} }: dataFormProps)