개발자

리액트 타입스크립트 obj[key] 에러

2024년 02월 16일조회 92

타입스크립트 이제 막 적용해보는 초보입니다.. 코드 내 monitorMenu[type].container 에서 [type]에 에러가 뜨는데 타입 지정이 잘못 된 건지 찾아봐도 원인을 모르겠습니다ㅜㅜ 물어볼 곳이 없어 질문합니다,,! 도움 부탁드립니다...ㅠㅠ // code import React, { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import DashboardContainer from '../containers/DashboardContainer'; import IntegratedContainer from '../containers/IntegratedContainer'; interface IMonitorMenu { [key: string]: { container: string | JSX.Element; }; } const Monitor = () => { const user: any = []; const { type } = useParams<{ type?: string }>(); const navigate = useNavigate(); const [menu, setMenu] = useState('integrated'); const onClickMenu = (name: string) => { navigate(`/monitor/${name}`); }; const monitorMenu: IMonitorMenu = { integrated: { container: <IntegratedContainer /> }, dashboard: { container: <DashboardContainer /> }, }; return ( <div> ... <div>{monitorMenu[type].container}</div> </div> ); }; export default Monitor; // error ERROR in src/pages/Monitor.tsx:37:25 TS2538: Type 'undefined' cannot be used as an index type.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

조용구님의 프로필 사진

안녕하세요 :) 실행해보진 않았는데 코드만 보면 type 변수가 문제로 보여요! 이 부분을 보면 --- const { type } = useParams<{ type?: string }>(); --- type은 옵셔널이라 undefined 값이될 가능성이 있어서 타입 에러가 발생하는 것 같아요. 이렇게 변경하면 동작 될거에요! --- <div>{type && monitorMenu[type].container}</div> ---

profile picture

익명

작성자

2024년 02월 17일

친절한 답변 너무 감사합니다!!!ㅜㅜ!!!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 16일

타입스크립트를 사용할 때 런타임에는 존재하지 않을 수 있는 값에 접근하려 시도하면 컴파일 시 에러가 발생합니다. 여기서 `type`은 `undefined`일 수 있습니다. 따라서, `monitorMenu[type].container`는 `monitorMenu[undefined].container`가 될 수 있으며 이것이 에러의 원인입니다. 그럼 이 문제를 어떻게 해결할까요? 최선의 방법은 "type"이 항상 정의되는지 확인하는 것입니다. TypeScript에서 옵셔널 파라미터로 문자열을 가져오고 'useParams' 훅을 사용하면, 해당 값이 항상 존재한다고 보장할 수 있습니다. 그러나 만약 그것이 가능하지 않다면, 단지 하나의 방법으로 진행해야합니다: type이 지정되었는지 확인하고(즉, undefined가 아닌지 확인) 그렇지 않은 경우 기본값을 설정해야합니다. ```tsx // 리액트와 관련된 모듈 임포트 생략... const Monitor = () => { // 다른 코드들 생략... const monitorMenu: IMonitorMenu = { integrated: { container: <IntegratedContainer /> }, dashboard: { container: <DashboardContainer /> }, }; return ( <div> ... <div>{type && monitorMenu[type] ? monitorMenu[type].container : null}</div> </div> ); }; export default Monitor; ``` 위의 코드는 type이 있고, monitorMenu[type]도 정의되어있으면 그 컴포넌트를 렌더링하고 아니면 null을 렌더링합니다. 이런 방법으로 에러를 방지할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!