ค้นหาเว็บไซต์

typescript - วิธีการพิมพ์รายการ listener ของ createListenerMiddleware ใน Redux-Toolkit


เมื่อเร็วๆ นี้ฉันได้ลองรวมการใช้งาน createListenerMiddleware ของ redux-toolkit แต่ตอนนี้ฉันติดอยู่เล็กน้อย ฉันพยายามจะระบุประเภทบางส่วนของ "listener entries" ของฉัน แต่ดูเหมือนจะทำไม่ได้ Intelli-sense ไม่เข้าใจสำหรับฉันเลย และฉันก็ไม่สามารถหาตัวอย่างในเอกสารหรือทางออนไลน์สำหรับเรื่องนี้ได้ เป้าหมายคือการมีตัวแปร listenerApi ที่ถูกระบุประเภท เพื่อฉันจะได้ใช้ฟังก์ชัน getState() ได้โดยไม่ต้องทำการแปลงประเภทใดๆ

มีวิธีง่ายๆ ในการทำสิ่งนี้หรือไม่?

ความช่วยเหลือใดๆ จะได้รับการชื่นชมอย่างมาก

listenerMiddleware.startListening({
  actionCreator: toggleSomething, // Action generator from reducer createSlice
  effect: async (
    action: AnyAction,
    listenerApi: ListenerEffectAPI<AppState, Dispatch> // Trying to type this in some way :[
  ): Promise<void> => {
    const state = (await listenerApi.getState()) as AppState; // TODO: type this better
  },
});

คำตอบ #1

startListening ถูกออกแบบมาเพื่อสรุปประเภท TS ที่ถูกต้องให้มากที่สุดเท่าที่จะทำได้

สมมติว่าฟังก์ชันสร้างแอคชันของคุณ ( toggleSomething ) ถูกพิมพ์ประเภทอย่างถูกต้อง (ซึ่งควรเป็นเช่นนั้นถ้าคุณกำลังปฏิบัติตามแนวทางการใช้งาน RTK TS ของเรา) startListening จะสามารถระบุประเภทของ action ภายใน callback effect ได้อย่างถูกต้อง

นั่นทำให้เกิดคำถามเกี่ยวกับประเภทของ getState RTK และ TS ไม่สามารถทราบล่วงหน้าได้ เพราะ middleware จะถูกเพิ่มเข้าไปใน store นั่นเป็นเหตุผลที่เราออกแบบ API ให้คุณสามารถสร้างเวอร์ชัน "pre-typed" ของ startListening ที่มีการประยุกต์ใช้ประเภท state ที่ถูกต้อง ดังแสดงในเอกสาร API ที่นี่:

  • https://redux-toolkit.js.org/api/createListenerMiddleware#typescript-usage

ตัวอย่าง :

// listenerMiddleware.ts
import { createListenerMiddleware, addListener } from '@reduxjs/toolkit'
import type { TypedStartListening, TypedAddListener } from '@reduxjs/toolkit'

import type { RootState, AppDispatch } from './store'

export const listenerMiddleware = createListenerMiddleware()

export type AppStartListening = TypedStartListening<RootState, AppDispatch>

export const startAppListening =
  listenerMiddleware.startListening as AppStartListening

export const addAppListener = addListener as TypedAddListener<
  RootState,
  AppDispatch
>

บทความที่เกี่ยวข้อง