Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Hooks und Store in React Native mit TypeScript typisieren

Hooks und Store typisieren

~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

cartStore.ts aus Kapitel 12 ist bereits typisiert – jetzt folgt der Redux-Toolkit-Favoritenstore aus Kapitel 3, GENAU wie in "React für Profis" Kapitel 42, plus ein React-Native-spezifisches Detail: Reanimateds useSharedValue.

favoritesSlice.js zu favoritesSlice.ts

store/favoritesSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';

interface FavoritesState {
  skus: string[];
}

const initialState: FavoritesState = { skus: [] };

const favoritesSlice = createSlice({
  name: 'favorites',
  initialState,
  reducers: {
    toggleFavorite(state, action: PayloadAction<string>) {
      const sku = action.payload;
      if (state.skus.includes(sku)) {
        state.skus = state.skus.filter((s) => s !== sku);
      } else {
        state.skus.push(sku);
      }
    },
  },
});

export const { toggleFavorite } = favoritesSlice.actions;
export default favoritesSlice.reducer;

store/index.js zu index.ts

store/index.ts
import { configureStore } from '@reduxjs/toolkit';
import favoritesReducer from './favoritesSlice';

export const store = configureStore({
  reducer: {
    favorites: favoritesReducer,
  },
});

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

store/hooks.ts anlegen: typisierte useSelector/useDispatch

Identisches Muster zu "React für Profis" Kapitel 42:

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

export const useAppDispatch = () => useDispatch<AppDispatch>();
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;

Ab jetzt useAppSelector/useAppDispatch statt der "nackten" Hooks aus react-redux verwenden – der Selektor-Parameter bekommt automatisch den korrekten RootState-Typ:

// In FavoritesScreen.tsx / ProductListScreen.tsx:
import { useAppSelector, useAppDispatch } from '../store/hooks';

const favoriteSkus = useAppSelector((state) => state.favorites.skus);
const dispatch = useAppDispatch();

Reanimated-Hooks: automatisch typisiert, mit einer Ausnahme

useSharedValue, useAnimatedStyle und withSpring aus Kapitel 9/13 sind bereits VOLLSTÄNDIG typisiert, ohne dass wir etwas tun müssen – useSharedValue(1) leitet automatisch SharedValue<number> ab, GENAU wie useState(1) automatisch number ableitet (siehe "React für Profis" Kapitel 42). EINE Stelle braucht dennoch Aufmerksamkeit: runOnJS aus dem Gesture-Handler-Kapitel.

import { runOnJS } from 'react-native-reanimated';

function onRemove(sku: string): void {
  // ...
}

// TypeScript prüft, dass die Argumente von runOnJS(onRemove) zur Signatur von onRemove passen:
runOnJS(onRemove)(item.sku); // sku: string - passt zu (sku: string) => void

Achtung: runOnJS ist GENERISCH über die Funktionssignatur der übergebenen Funktion – übergeben Sie versehentlich eine Zahl statt eines Strings (runOnJS(onRemove)(42)), meldet TypeScript den Fehler SOFORT. Das ist besonders wertvoll bei runOnJS, weil ein Laufzeitfehler INNERHALB eines Worklets (auf dem UI-Thread) oft schwerer zu debuggen ist als ein normaler JS-Thread-Fehler.

Gesture.Pan() Events typisieren

import { Gesture } from 'react-native-gesture-handler';
import { GestureUpdateEvent, PanGestureHandlerEventPayload } from 'react-native-gesture-handler';

const panGesture = Gesture.Pan().onUpdate(
  (event: GestureUpdateEvent<PanGestureHandlerEventPayload>) => {
    translateX.value = Math.min(0, event.translationX);
  }
);

In der Praxis leitet TypeScript den Event-Typ innerhalb von .onUpdate(...) meistens AUTOMATISCH korrekt ab, ohne die explizite Annotation – sie ist hier zur VERDEUTLICHUNG gezeigt, welcher Typ tatsächlich dahintersteckt, für den Fall, dass Sie event in eine separate, benannte Funktion auslagern (dort wird die explizite Annotation dann PFLICHT).

Tipp: Faustregel für Drittanbieter-Bibliotheken: bevor Sie einen Typ von Hand schreiben, prüfen Sie, ob die Bibliothek ihn bereits EXPORTIERT (wie GestureUpdateEvent, PanGestureHandlerEventPayload hier) – moderne RN-Bibliotheken wie Reanimated und Gesture Handler sind selbst in TypeScript geschrieben und liefern präzise, vom Autor gepflegte Typen mit, die zuverlässiger sind als selbst geschriebene Annäherungen.