Index signature
이슈
- Nextjs, tailwind를 통해 간단한 클론을 해보던 도중, 아래와 같은 이슈가 발생하였다.
- 위 사진은
fetch
가 속한getServerSideProps
와 데이터를 받아올 쿼리문이 작성된json
파일을 통해 데이터를 받아온 후Home
컴포넌트에 전달하는 로직이다. 그런데requests[genre]
부분에서 지속적으로 에러가 발생하였다. 위 사진에는 보이지 않지만, 헤더의 아이템을 클릭했을 때 동적으로 변하는 쿼리값에 따라서 받아오는 데이터도 변했어야 하므로 변수로 접근해야만 해당 기능이 구현 가능하기 때문에 확인해보니 다음과 같은 방법이 필요했다.
해결
- 위와 같은 에러가 발생한 이유는, 바로
index signature
을 지정하지 않았기 때문에다. 즉 JavaScript와 달리 TypeScript는 객체의 프로퍼티를 읽을 때string
형식의key
사용을 허용하지 않는다. 따라서 접근하고자 하는key
값의type
을 지정해줘야만 하므로 다음과 같은 타입 지정을 통해 해결할 수 있었다. (접근하고자 하는key
값의 naming은 자유롭게 사용할 수 있다.)
const response = await fetch(
`https://api.themoviedb.org/3${
requests[genre]?.url || requests.fetchTopRated.url
}`
);
// index.tsx
type RequestsType = {
readonly [fetchType: string]: {
title: string;
url: string;
};
};
// requests.ts
export const requests: RequestsType = {
fetchTrending: {
title: "Trending",
url: `/trending/all/week?api_key=${API_KEY}&language=en-US`,
},
fetchTopRated: {
title: "Top Rated",
url: `/movie/top_rated?api_key=${API_KEY}&language=en-US`,
},
- 추가로
index signature
을 사용할 경우, 객체 내부 모든 속성 값의 타입을 일일이 모두 선언해줄 필요가 없어진다. 물론 엄격하게 사용하고자 할 경우 피해야 하지만, 스타일 지정의 경우 색상값이 추가될 때 타입을 전체적으로 일일이 명시해줘야 할 필요가 있기 때문에 이러한 점에서는 매우 유용한 기능이라고 생각한다.
Reference
'TypeScript' 카테고리의 다른 글
TIL | Custom hook with return tuple type array (0) | 2022.12.16 |
---|---|
TIL | Type guard (0) | 2022.03.15 |
TIL | Interface VS Type (0) | 2021.10.24 |
TIL | Generics (0) | 2021.10.23 |
TIL | Interface (0) | 2021.10.23 |