개발자
타입스크립트 이제 막 적용해보는 초보입니다.. 코드 내 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.
답변 1
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 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을 렌더링합니다. 이런 방법으로 에러를 방지할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!