- fetch의 타입
- BlogPosts컴포넌트에 프롭으로 전달
- error객체의 타입 지정
fetch의 타입
프로미스를 반환함
프로미스는 제네릭 타입인데 어떤 값을 생성할 프로미스
response 객체
response는 브라우저에서 제공되는 또다른 타입 (Response)
response.json()으로 JSON데이터를 얻을 수 있음
.json은 promise를 또 반환
그런데 백엔드로부터 받는 데이터가 어떤 형식인지 모르므로
any타입으로 지정될 수밖에 없음
참고 : Zod 라이브러리
데이터를 유효성 검사하고
유효성 검사 결과에 따라 TypeScript에서
자동으로 타입을 추론할 수 있게 해줌
임시방편 as
const data = response.json() as unknown;
any보단 나은것이 unknown을 사용하면
TypeScript가 알지 못하는 속성에 액세스하려고 하면 오류가 발생
useEffect에서 async 함수 사용해보기
How to use async function in useEffect?
In React we all must have used useEffect hook which runs after performing DOM updates and helps us to...
dev.to
기본적으로 useEffect에서는 프로미스를 반환할 수 없음
useEffects는 아무것도 반환하지 않든지, 함수를 반환해야 함
방법은 내부에 중첩으로 async 함수를 사용하든지
바깥으로 async 함수를 꺼내든지
import { useEffect, useState } from "react";
import { type BlogPost } from "./components/BlogPosts";
import { get } from "./util/http";
function App() {
const [fetchedPosts, setFetchedPosts] = useState<BlogPost[]>();
useEffect(() => {
const fetchData = async () => {
};
fetchData();
}, []);
return <h1>Data Fetching!</h1>;
}
export default App;
가져온 Data의 타입 설정
jsonplaceholder에서 가져온 데이터의 타입은 아래와 같음
type RawDataBlogPost = {
id: number;
userId: number;
title: string;
body: string;
};
아래와 같이 하면
응답 기다린 후에 얻게된 결과의 타입을 지정할 수 있음
const data = (await get(
"https://jsonplaceholder.typicode.com/posts"
)) as RawDataBlogPost[];
가져온 rawData 변경
fetchedPosts의 형식은
아래와 같고
아래의 형식을 따라서
가져온 데이터를 코드에서 활용할 것이므로.
export type BlogPost = {
id: number;
title: string;
text: string;
};
const blogPosts: BlogPost[] = data.map((rawPost) => {
return {
id: rawPost.id,
title: rawPost.title,
text: rawPost.body,
};
});
setFetchedPosts(blogPosts);
BlogPosts컴포넌트에 프롭으로 전달
에러
fetchedPosts의 스테이트값이 초기 undefined이기 때문에
발생할 수 있는 에러를 타입스크립트가 알려준 것.
아래와 같이 수정하여
fetchedPosts가 undefined일때 에러가 나지 않도록 하자
return (
<main>
<img src={fetchingImg} alt="abstract img" />
{fetchedPosts &&<BlogPosts posts={fetchedPosts} />}
</main>
);
error객체의 타입 지정
try catch를 하면
error의 객체 타입이 무엇인지 알 수 없어서
에러가 남
방법 1. as 로 타입 캐스팅
setError((err as Error).message);
방법 2. if 체크
catch (err) {
if (err instanceof Error) {
setError(err.message);
}
}
'공부기록 > Typescript' 카테고리의 다른 글
React Typescript Webpack setup 해보기 (0) | 2023.12.19 |
---|---|
#76 (0) | 2023.11.16 |
# 65 Context Api 타입지정 (0) | 2023.11.16 |
# 58 Form 래퍼 컴포넌트 타입지정 (0) | 2023.11.15 |
#57 forwardRef의 타입지정 (0) | 2023.11.15 |