-
[typescript] 너는 무슨 타입이니? (keyof 연산자, Record<string, boolean>)프론트엔드 개발자가 될거야./ts 2023. 5. 17. 12:40
- previewImage 상태 변수에서 kyc 값에 따라 이미지를 렌더링하는 기능을 구현할 때
interface IPreviewImage { advanced: string; basic: string; } const [previewImage, setPreviewImage] = useRecoilState<IPreviewImage>(previewImageState); {previewImage[kyc as keyof IPreviewImage] && ( <Preview src={previewImage[kyc as keyof IPreviewImage]} alt="Image preview" /> )}
IPreviewImage 인터페이스와 previewImage 상태 변수를 사용하여 이미지 미리보기를 구현하는 부분이다.
IPreviewImage 인터페이스는 advanced와 basic 두 개의 속성을 갖고 있고 previewImage 상태 변수는 useRecoilState 훅을 사용하여 상태와 상태 업데이트 함수를 가져온다.
그 다음 코드에서는 previewImage 상태 변수에서 kyc 값을 키로 사용하여 해당하는 이미지를 가져오고 있다.
kyc 값은 advanced 또는 basic 중 하나이며, previewImage 객체의 속성에 접근하기 위해 keyof 연산자를 사용했다.
이후, 해당 이미지가 존재하는 경우 <Preview> 컴포넌트를 렌더링한다.
<Preview> 컴포넌트는 src 속성에 previewImage[kyc as keyof IPreviewImage] 값을 전달한다.
previewImage 객체의 속성에 접근하기 위해 keyof 연산자를 사용하여 타입을 알려주었다는 것이 포인트이다!
- 인터페이스 vs Record<string, boolean>
const [tutorial, setTutorial] = useState({ first: false, second: false, });
이러한 state가 있을 때 나는 상황에 따라 다 두가지의 방법으로 타입을 지정하곤 한다.
1. 속성의 의미를 명확히 알고 있고 재사용성이 필요한 경우 => ITutorial 인터페이스 사용
interface ITutorial { first: boolean; second: boolean; } const [tutorial, setTutorial] = useState<ITutorial>({ first: false, second: false, });
ITutorial은 first와 second라는 명시적인 속성을 가지고 있으며, 이는 코드의 가독성과 이해를 증가시킨다.
2. 동적인 속성이 필요하거나 속성의 의미가 명확하지 않은 경우 => Record<string, boolean> 사용
const [tutorial, setTutorial] = useState<Record<string, boolean>>({ first: false, second: false, });
특정 속성이 고정되어 있지 않고, 동적으로 변할 경우 Record<string, boolean>을 사용하는 것이 유연성을 제공한다.
'프론트엔드 개발자가 될거야. > ts' 카테고리의 다른 글
[react][react-modal][typeScript] react-modal typeScript 환경에서 style 적용하기 (0) 2023.02.08 [typeScript 오류] li tag : onMouseOver must be accompanied by onFocus for accessibility (0) 2023.02.07