MyForm.tsx 파일을 생성한다.
import { useState } from "react";
function MyForm() {
return (
<form>
<input name="name" />
<input name="desc" />
<button type="submit">Enter</button>
</form>
);
}
export default MyForm;
interface MyFormProps {
onSubmit: (form: { name: string; desc: string }) => void;
}
함수명:()⇒반환타입
으로 지정해주어야 한다.import { useState } from "react";
interface MyFormProps {
onSubmit: (form: { name: string; desc: string }) => void;
}
function MyForm() {
const [form, setForm] = useState({
name: "",
desc: ""
});
return (
<form>
<input name="name" />
<input name="desc" />
<button type="submit">Enter</button>
</form>
);
}
export default MyForm;
const onChange = (e:any) => { };
<form>
<input name="name" onChange={onChange} />
<input name="desc" onChange={onChange} />
<button type="submit">Enter</button>
</form>
any
로 작성한다.import { useState } from "react";
interface MyFormProps {
onSubmit: (form: { name: string; desc: string }) => void;
}
function MyForm() {
const [form, setForm] = useState({
name: "",
desc: ""
});
const { name, desc } = form;
const onChange = (e: any) => {};
return (
<form>
<input name="name" onChange={onChange} value={name} />
<input name="desc" onChange={onChange} value={desc} />
<button type="submit">Enter</button>
</form>
);
}
export default MyForm;
name
과 desc
라는 변수에 form 값을 구조분해할당하여 input의 각 value값을 지정해준다.const onChange = (e: any) => {
const {name, value} = e.target;
setForm({
...form,
[name]:value,
})
};
import { useState } from "react";
interface MyFormProps {
onSubmit: (form: { name: string; desc: string }) => void;
}
function MyForm({onSubmit}:MyFormProps) {
const [form, setForm] = useState({
name: "",
desc: ""
});
const { name, desc } = form;
const onChange = (e: any) => {
const {name, value} = e.target;
setForm({
...form,
[name]:value,
})
};
const onSubmitForm = (e:any) => {
e.preventDefault();
onSubmit(form);
setForm({
name:'',
desc:'',
})
}
return (
<form onSubmit={onSubmitForm}>
<input name="name" onChange={onChange} value={name} />
<input name="desc" onChange={onChange} value={desc} />
<button type="submit">Enter</button>
</form>
);
}
export default MyForm;
function MyForm({onSubmit}:MyFormProps)
와 같이 작성한다. props의 interface가 MyFormProps라는 것을 의미한다.const onSubmitForm = (e:any) => {
e.preventDefault();
onSubmit(form);
setForm({
name:'',
desc:'',
})
}
🔻 App.tsx
import MyForm from "./MyForm";
export default function App() {
const onSubmit = (form: { name: string; desc: string }) => {
console.log(form);
};
return <MyForm onSubmit={onSubmit} />;
}
MyFormProps를 지정해줌으로써 부모 컴포넌트가 필수적으로 넘겨야 할 props 정보에 대해 직관적으로 알 수 있다.
💡 타입 단언 : 타입스크립트가 타입 추론을 통해 판단할 수 있는 타입의 범주를 넘는 경우, 더 이상 추론하지 않도록 지시
🔻 예제
function someFunc(value:string|number, isNumber:boolean):string|number{
if(isNumber){
return (value as number).toFixed(2);
}
else return (value as string).toLowerCase();
}
console.log(someFunc(2.3456,true)); //2.35
console.log(someFunc("HeLlO",false)); //hello
value
값이 string일지 number일지 모호하기 때문에 value.toFixed()에서 에러를 내준다.as
키워드를 통해 value 변수의 타입을 단언해줄 수 있다.💡 타입 가드 : 타입스크립트가 추론 가능한 특정 범위(scope)에서 타입을 보장할 수 있음
function isNumber(value:string|number):value is number{
return typeof value === 'number';
}
function someFunc(value:string|number):string|number{
if(isNumber(value)){
value = value.toFixed(2);
}else{
value = value.toLowerCase();
}
return value;
}
console.log(someFunc(234));
NAME is TYPE
형태의 타입 술부(Predicate)를 반환 타입으로 명시한 함수이다.value is number
이다.