[TypeScript] React에서 사용하기_2편

2022. 7. 10. 17:49·TypeScript/기초
반응형

state와 reducer 만들 때 타입 지정 

import { Provider } from 'react-redux';
import { createStore } from 'redux';

const 초기값 = { count: 0 };

function reducer(state = 초기값, action) {
  if (action.type === '증가') {
    return { count : state.count + 1 }
  } else if (action.type === '감소'){
    return { count : state.count - 1 }
  } else {
    return initialState
  }
}

const store = createStore(reducer);

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
)

redux를 사용할 때 초기값 부분과 reducer, store에 타입을 지정할 수 있다. 

 

import { Provider } from 'react-redux';
import { createStore } from 'redux';

interface Counter {
  count : number
}

const 초기값 :Counter  = { count: 0 };                    -- 1

function reducer(state = 초기값, action :any) {           -- 2
  if (action.type === '증가') {
    return { count : state.count + 1 }
  } else if (action.type === '감소'){
    return { count : state.count - 1 }
  } else {
    return initialState
  }
}

const store = createStore(reducer);

export type RootState = ReturnType<typeof store.getState> -- 3

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
)
  1. initialState로 초기값을 가지고 있는데, count 하나의 속성만 사용하고 있다. 
    초기값 : const 초기값 :{ count :number } 방식으로 바로 지정해도 되지만, 가독성을 위해서 따로 뺄 수 있다. 
  2. state는 이미 초기값에 타입이 지정되어 있어 추가로 지정할 필요 없고, action은 dispatch 보낼 때 object 자료형을 타입에 지정해주면 된다. 
    현재는 편의상 any를 했는데, action :{type :string, payload :number } 등으로 지정하면 된다.  
    또한 reducer의 return 타입도 지정해줄 수 있는데, 일반적으론 state, 초기값의 타입과 동일하다.
  3. 해당 부분은 redux에 있던 state를 가져올 때 사용하는 타입이다. 

State 가져오기

import React from 'react';
import { useDispatch, useSelector } from 'react-redux'
import { Dispatch } from 'redux'
import {RootState} from './index'

function App() {
  const data = useSelector( (state :RootState) => state );   // -- 1
  const dispatch :Dispatch = useDispatch();                  // -- 2

  return (
    <div className="App">
      { data.count }
      <button onClick={()=>{dispatch({type : '증가'})}}>버튼</button>
      <Profile name="kim"></Profile>
    </div>
  );
}
  1. state가 어떻게 구성되어 있는지 파악해서 직접 지정해줄 수 있지만, 위에서 지정한 RootState를 불러와서
    지정할 수 있다.
    export type RootState = ReturnType<typeof store.getState>가 store의 타입을 export 하는 방법이다. 
  2. useDispatch도 타입을 지정하면 좋은데, redux에서 제공하는 Dispatch를 지정해주면 된다. 

 

@reduxjs/toolkit 에서 타입 지정하기 

@reduxjs/toolkit은 redux를 깔끔하게 짤 수 있게 도와준다. 

mport { createSlice, configureStore } from '@reduxjs/toolkit';
import { Provider } from 'react-redux';

const 초기값 = { count: 0, user : 'kim' };                                 // -- 1

const counterSlice = createSlice({
  name: 'counter',
  initialState : 초기값,
  reducers: {
    increment (state){
      state.count += 1
    },
    decrement (state){
      state.count -= 1
    },
    incrementByAmount (state, action :any){                               // -- 2
      state.count += action.payload
    }
  }
})

let store = configureStore({
  reducer: {
    counter1 : counterSlice.reducer
  }
})

export type RootState = ReturnType<typeof store.getState>

export let {increment, decrement, incrementByAmount} = counterSlice.actions // -- 3
  1. 초기값은 마찬가지로 interface Counter  { count :number, user :string } 같은 방식으로 지정하면 된다. 
  2. action의 지정 방식은 새롭게 있는데, 
    import { PayloadAction } from '@reduxjs/toolkit' 으로 패키지를 다운받고 
    increamentByAmount (state, action :PayloadAction<number>) { } 로 PayloadAction에 <> 를 사용해서 지정한다. 

State를 가져오는 방식은 기존과 동일하게 가져오면 된다. 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'TypeScript > 기초' 카테고리의 다른 글

[TypeScript] Declare & Ambient Module  (1) 2022.07.11
[TypeScript] Tuple Type  (2) 2022.07.10
[TypeScript] React에서 사용하기_1편  (1) 2022.07.09
[TypeScript] Generic  (1) 2022.07.08
[TypeScript] Protected & Static  (1) 2022.07.07
'TypeScript/기초' 카테고리의 다른 글
  • [TypeScript] Declare & Ambient Module
  • [TypeScript] Tuple Type
  • [TypeScript] React에서 사용하기_1편
  • [TypeScript] Generic
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    next.js
    덤프
    리액트
    Node.js
    타입스크립트
    리얼클래스
    알고리즘
    바질 키우기
    ChatGPT
    CCNA
    webpack
    ReactNative
    리얼학습일기
    CSS
    javascript
    Babel
    영어독학
    타일러영어
    typescript
    react
    영어회화
    다이소
    redux
    식물
    자바스크립트
    네트워크
    네이버 부스트캠프
    바질
    Docker
    프로그래머스
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[TypeScript] React에서 사용하기_2편
상단으로

티스토리툴바