본문 바로가기

타입스크립트

[react, type] Uncaught TypeError: local.map is not a function

반응형

리액트와 타입스크립트를 짬뽕해서 프로젝트를 만들어 보던 중 부모 컴포넌트로 부터 state 를 전달받아 state. map 형태로
리스트를 그려주려 했는데, 뜬금없이 타입 에러가 떳다.

그건 Uncaught TypeError: local.map is not a function 였는데, 이에 대해 검색해보니 map이 전달받은 local 이 배열이 아닌 경우에 띄워주는 에러 메시지 라고 하더라

( 즉, 배열이 아닌 것에 map() 함수로 접근하니 local.map()는 함수가 아니라고 잔소리를 한 것이다.),

그래서 해결 책으로 아래의 형식으로 map 이 전달 받은 것이 배열이면 map 을 실행하고, 아니라면 null을 반환하도록 삼항연산식 을 적용 했더니 무사히 해결 되었다

(근데 local을 출력 해보면 배열이 분명한데, 왜 배열이 아니라고 한 걸까? 타입스크립트를 적용했을 때 생긴 문제이니까 분명 타입 설정을 잘못한 것일수도 있겠다. 한 번 확인해봐야 겠다)

 

=> 초기에 컴포넌트가 랜더링 될 당시에는 Array 데이터가 존재하지 않는 상태이기 때문에 발생하는 것이라 하더라. 그래서 조건 형태로 받아온 데이터가 확인될 때 코드가 실행되도록 코드를 작성함으로써 이 문제를 해결하는 것이다).

Array.isArray(local)?  코드 : null

참고로 Array.isArray( 데이터 ) 는 ( )에 들어간 데이터가 배열인지 아닌지를 확인해주는 함수이다.

interface ButtonWeaType{
    local:string[]
    setLocal:Function
        
    }
const ButtonWea:React.FC<ButtonWeaType>= ({local,setLocal}) =>{
 
 
    return (
       <div className='button'>
            <h4>주요 지역 날씨</h4>
            <div className='btn'>

            //local 이 배열이라면 map 함수를 실행하고, 아니라면 null 을 반환한다.
            {Array.isArray(local)
            ? local.map((local,i:number)=>{
                return (
                    <Button
                        onClick={()=>{
                            setLocal(local) 
                             }
                        } 
                        key={i} 
                        variant="dark">{local}
                    </Button>
                )
              }) : null
            }
            </div>
      </div>
    )
}
반응형