[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)
  • 태그

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

티스토리툴바