TypeScript가 포함된 Redux 툴킷

typescript와 함께 redux 툴킷 사용

이 경우 간단한 앱을 만들고 싶습니다. 사용자를 redux 상태에 추가할 수 있습니다.



redux 툴킷 설치

npm i @reduxjs/toolkit react-redux


반응에 대한 typescript 추가

npm i typescript @types/react-redux @types/react-dom @types/react @types/node @types/jest


tsconfig.json 생성

{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react"
  }
}


src/app/store.ts에 새 파일을 만들어 저장소를 구성하지 않도록 합니다.

import { configureStore } from '@reduxjs/toolkit'
import usersReducer from '../features/users/usersSlice'

export const store = configureStore({
    reducer: {
        // register your reducer here
        users: usersReducer,
    },
})

export type AppDispatch = typeof store.dispatch
export type RootState = ReturnType<typeof store.getState>


왜냐하면 우리는 typescript를 사용하고 있기 때문입니다. 디스패치 및 상태 선택기에 대한 사용자 정의 유형 후크를 추가하는 것이 좋습니다. 따라서 이 코드를 복사하여 app/hooks.ts에 붙여넣습니다.

import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from './store'

// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch = () => useDispatch<AppDispatch>()
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector


index.tsx에서 redux의 공급자로 앱 구성 요소 래핑

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import { store } from './app/store'
import { Provider } from 'react-redux'

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


상태, 감속기 등을 저장하기 위해 src/features/users/usersSlice.ts 생성

import { PayloadAction, createSlice } from '@reduxjs/toolkit'
import { RootState } from '../../app/store'

interface UsersState {
    value: [
        {
            id: number
            name: string
        }
    ]
}

const initialState: UsersState = {
    value: [
        {
            id: 1,
            name: 'jack',
        },
    ],
}

export const usersSlice = createSlice({
    name: 'users',
    initialState, // users state
    reducers: {
        // logic to add user
        addUser: (state, action: PayloadAction<{ id: number; name: string }>) => {
            state.value.push(action.payload)
        },
    },
})

// export state selector
export const selectUsers = (state: RootState) => state.users.value
// export dispatch actions
export const { addUser } = usersSlice.actions
// export reducer for register it to the store
export default usersSlice.reducer


app.tsx에서 상태 및 감속기 작업을 사용해 보겠습니다.


import React, { useEffect, useState } from 'react'
import { useAppDispatch, useAppSelector } from './app/hooks'
import { addUser, selectUsers } from './features/users/usersSlice'

export default function App() {
    const dispatch = useAppDispatch()
    const users = useAppSelector(selectUsers)

    const [name, setName] = useState<string>('')

    return (
        <div>
            <p>{JSON.stringify(users)}</p>
            <input
                type="text"
                placeholder="Name"
                onChange={(e) => setName(e.target.value)}
            />
            <button onClick={() => dispatch(addUser({ id: users.length + 1, name }))}>
                Add User
            </button>
        </div>
    )
}


서버에 별표를 표시하고 짜잔! 마침내 redux에 typescript를 사용할 수 있습니다
  • Redux 툴킷 ^1.7
  • React Redux ^7.2
  • 반응 ^17
  • 타입스크립트 ^4.5
  • 좋은 웹페이지 즐겨찾기