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

Navigation und API-Antworten in React Native mit TypeScript typisieren

Navigation und API-Antworten typisieren

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

Der wichtigste React-Native-spezifische TypeScript-Baustein, der in "React für Profis" keine Entsprechung hat: React Navigations Typisierung. Ohne sie ist route.params in JEDEM Screen einfach any – TypeScript kann bei einem Tippfehler wie route.params.productSk (statt productSku) nicht helfen.

Den zentralen Typ: RootStackParamList

React Navigation erwartet EINEN zentralen Typ, der für JEDEN Screen-Namen beschreibt, WELCHE Parameter er beim Navigieren erwartet (oder undefined, wenn er keine braucht):

types/navigation.ts
export type RootStackParamList = {
  ProductList: undefined;
  ProductDetail: { productSku: string };
  Favorites: undefined;
  Cart: undefined;
};

ProductDetail: {{ productSku: string }} beschreibt GENAU das, was wir bereits aus "React Native für Einsteiger" kennen: navigation.navigate('ProductDetail', {{ productSku: item.sku }}). ProductList: undefined bedeutet: dieser Screen erwartet KEINE Parameter.

ProductDetailScreen.tsx: die Props typisieren

import { NativeStackScreenProps } from '@react-navigation/native-stack';
import type { RootStackParamList } from '../types/navigation';

type Props = NativeStackScreenProps<RootStackParamList, 'ProductDetail'>;

function ProductDetailScreen({ route }: Props) {
  const { productSku } = route.params; // automatisch als string erkannt
  // ...
}

NativeStackScreenProps<RootStackParamList, 'ProductDetail'> – der ZWEITE Typ-Parameter ('ProductDetail') sagt TypeScript, WELCHER Eintrag aus RootStackParamList gilt. route.params ist dadurch automatisch {{ productSku: string }}, route.params.productSk (Tippfehler) würde SOFORT einen Fehler zeigen.

// In ProductListScreen.tsx:
navigation.navigate('ProductDetail', { productSku: item.sku }); // ✓ korrekt
navigation.navigate('ProductDetail', { productSk: item.sku });  // ✗ TypeScript-Fehler
navigation.navigate('ProductDetail');                          // ✗ TypeScript-Fehler: fehlender Parameter
navigation.navigate('Favorites');                              // ✓ korrekt, kein Parameter nötig

Achtung: Diese Prüfung funktioniert nur, wenn navigation selbst korrekt typisiert ist – über dieselben NativeStackScreenProps<RootStackParamList, 'ProductList'>-Props in ProductListScreen.tsx. Vergessen Sie diese Typisierung in EINEM Screen, verliert navigation.navigate(...) dort seine Typprüfung, obwohl andere Screens korrekt typisiert bleiben.

App.tsx: den Stack-Navigator mit dem Typ verbinden

import { createNativeStackNavigator } from '@react-navigation/native-stack';
import type { RootStackParamList } from './types/navigation';

const Stack = createNativeStackNavigator<RootStackParamList>();

createNativeStackNavigator<RootStackParamList>() verknüpft ALLE nachfolgenden <Stack.Screen name="...">-Einträge mit unserem zentralen Typ – ein name="ProductDetailx" (Tippfehler im Screen-Namen selbst) würde ebenfalls SOFORT als Fehler erkannt.

magentoApi.ts typisieren

Genau wie in "React für Profis" Kapitel 43 gilt: response.json() liefert IMMER any, der Rückgabetyp einer API-Funktion ist eine Behauptung, keine automatisch geprüfte Garantie.

api/magentoApi.ts
export interface Product {
  sku: string;
  name: string;
  price: number;
  imageUrl: string;
}

interface MagentoApiItem {
  sku: string;
  name: string;
  price: number;
  image?: string;
}

function mapMagentoProduct(item: MagentoApiItem): Product {
  return {
    sku: item.sku,
    name: item.name,
    price: item.price,
    imageUrl: item.image ?? 'https://picsum.photos/300',
  };
}

export async function fetchProducts(): Promise<Product[]> {
  const response = await fetch('https://api.example.com/products');

  if (!response.ok) {
    throw new Error(`API error: ${response.status}`);
  }

  const data = await response.json(); // Typ hier: 'any'
  return data.products.map(mapMagentoProduct);
}

export async function fetchProductBySku(sku: string): Promise<Product> {
  const response = await fetch(`https://api.example.com/products/${sku}`);

  if (!response.ok) {
    throw new Error(`API error: ${response.status}`);
  }

  const data = await response.json();
  return mapMagentoProduct(data);
}

export interface Product wird ab jetzt überall dort importiert, wo ein Produkt verarbeitet wird – ProductCards Props könnten alternativ auch als {{ product: Product }} statt einzelner name/price/imageUrl-Props modelliert werden, eine sinnvolle Aufräum-Übung für Sie.

Tipp: Damit ist die TypeScript-Migration des Kernprojekts abgeschlossen: Store (Zustand + Redux Toolkit), ProductCard, Navigation, und die API-Schicht sind typisiert. Führen Sie abschließend npx tsc --noEmit aus Kapitel 12 aus, um zu prüfen, ob noch irgendwo Typfehler übrig sind, bevor es im nächsten Kapitel mit automatisierten Tests weitergeht.