TypeScript + React praktisch

TypeScript bietet vollständige Typunterstützung für die React-Entwicklung und verbessert die Zuverlässigkeit des Codes.

Die Verwendung von TypeScript stellt sicher, dass React-Komponenten, Props, State usw. alle über eine vollständige Typprüfung verfügen, wodurch Laufzeitfehler reduziert werden.

React-Tutorial ansehen:https://www.example.com/vue3/react-tutorial.html


SVG-Diagramm: React + TypeScript-Entwicklungsworkflow Background Title React + TypeScript Type Support Components React Components React.FC<Props> interface ButtonProps { text: string React Hooks useState<T>(initial) useEffect(() => {}, []) useCallback<T>(fn) Events Event Handling React.FormEvent React.ChangeEvent React.MouseEvent Bottom half: Type Safety Advantages Brought by TypeScript Advantage 1 Compile-time Type Checking Advantage 2 Intelligent Code Completion Advantage 3 Safer Refactoring Arrow marker

Warum sollte man TypeScript in React verwenden?

Die komponentenbasierte Entwicklung mit React erzeugt eine große Menge an Datenfluss wie Props, State, Context usw.

Ohne Typdefinitionen ist es schwierig, die Quelle und Struktur der Daten nachzuvollziehen, und es kommt leicht zu Laufzeitfehlern.

TypeScript bietet ein vollständiges Typsystem für React: Komponenten-Props verfügen über Typprüfung, useState über Typinferenz und die Ereignisbehandlung über Typhinweise.

Datenfluss:Der Datenfluss in React (Props, State, Context) benötigt Typdefinitionen, und TypeScript kann die Typsicherheit des Datenflusses gewährleisten.


Ein Projekt erstellen

Verwende ein modernes Scaffolding-Tool, um ein React-Projekt zu erstellen, das TypeScript unterstützt.

Initialisieren

# Verwende Create React App (langsamer, aber vollständig)
npx create-react-app my-app --template typescript

# Oder verwende Vite (empfohlen, schneller)
npm create vite@latest my-app -- --template react-ts

Empfehlung:Vite ist derzeit das am meisten empfohlene React-Build-Tool, mit hoher Geschwindigkeit und guter Entwicklungserfahrung.


Komponententypen

Verwende den Typ React.FC, um Funktionskomponenten zu definieren.

src/components/Button.tsx

import React from "react";

// Definiere den Props-Typ für die Button-Komponente
interface ButtonProps {
    text: string;                    // Button-Text (erforderlich)
    onClick: () => void;             // Klick-Callback (erforderlich)
    disabled?: boolean;              // Ob deaktiviert (optional, Standardwert false)
    variant?: "primary" | "secondary"; // Button-Variante (optional)
}

// Definiere den Typ der Funktionskomponente mit React.FC
const Button: React.FC<ButtonProps> = ({
    text,
    onClick,
    disabled = false,
    variant = "primary"
}) => {
    return (
        <button
            className={`btn btn-${variant}`}
            onClick={onClick}
            disabled={disabled}
        >
            {text}
        </button>
    );
};

export default Button;

Ausführungsergebnis:

Button 组件渲染成功

React.FC:Dies ist der Typ einer React-Funktionskomponente, einschließlich integrierter Typen wie children, propTypes usw.


Props-Typen

Definiere die Props-Schnittstelle einer Komponente, um Daten an untergeordnete Komponenten zu übergeben.

src/components/UserCard.tsx

import React from "react";

// Definiere den Benutzertyp
interface User {
    id: number;           // Benutzer-ID
    name: string;        // Benutzername
    email: string;       // E-Mail
    avatar?: string;     // Avatar (optional)
}

// Definiere die Props für die UserCard-Komponente
interface UserCardProps {
    user: User;                       // User-Objekt (erforderlich)
    onEdit: (user: User) => void;    // Bearbeiten-Callback
    onDelete: (id: number) => void;  // Lösch-Callback
}

const UserCard: React.FC<UserCardProps> = ({ user, onEdit, onDelete }) => {
    return (
        <div className="user-card">
            {user.avatar && <img src={user.avatar} alt={user.name} />}
            <h3>{user.name}</h3>
            <p>{user.email}</p>
            <button onClick={() => onEdit(user)}>Bearbeiten</button>
            <button onClick={() => onDelete(user.id)}>Löschen</button>
        </div>
    );
};

export default UserCard;
Typweitergabe:Typen durch Props weitergeben, um konsistente Datentypen im gesamten Komponentenbaum sicherzustellen.

useState Typen

Geben Sie Typparameter für useState an, um den korrekten Zustandstyp sicherzustellen.

src/components/Counter.tsx

import React, { useState } from "react";

const Counter: React.FC = () => {
    // Basistyp: den number-Typ explizit angeben
    const [count, setCount] = useState<number>(0);

    // Objekttyp: den Objekttyp angeben
    const [user, setUser] = useState<{ name: string; age: number }>({
        name: "Alice",
        age: 25
    });

    return (
        <div>
            <p>Anzahl: {count}</p>
            <button onClick={() => setCount(c => c + 1)}>+1</button>
            <button onClick={() => setCount(c => c - 1)}>-1</button>

            <p>User: {user.name}, {user.age}</p>
            <button onClick={() => setUser({ ...user, age: user.age + 1 })}>
Alter+1
            </button>
        </div>
    );
};

export default Counter;

Ausführungsergebnis:

Counter 组件渲染成功

Generische Parameter:Das T in useState<T> ist der Typ des Zustands. Wenn ein Anfangswert angegeben wird, kann TypeScript ihn automatisch ableiten.


useEffect-Typen

useEffect bietet außerdem vollständige Typunterstützung.

src/components/DataFetcher.tsx

import React, { useState, useEffect } from "react";

// Definiere den Benutzertyp
interface User {
    id: number;
    name: string;
}

const DataFetcher: React.FC = () => {
    // Zustand der Benutzerliste
    const [users, setUsers] = useState<User[]>([]);
    // Ladezustand
    const [loading, setLoading] = useState<boolean>(wahr);
    // Fehlerzustand
    const [error, setError] = useState<string | null>(null);

    useEffect(() => {
        // Datenabruf simulieren
        fetch("/api/users")
            .then(res => res.json())
            .then(data => {
                setUsers(data);
                setLoading(false);
            })
            .catch(err => {
                setError(err.message);
                setLoading(false);
            });
    }, []);  // Leeres Abhängigkeitsarray: wird nur einmal ausgeführt, wenn die Komponente gemountet wird

    if (loading) return <div>Wird geladen...</div>;
    if (error) return <div>Error: {error}</div>;

    return (
        <ul>
            {users.map(user => (
                <li key={user.id}>{user.name}</li>
            ))}
        </ul>
    );
};

export default DataFetcher;

Abhängigkeitsarray:Der zweite Parameter von useEffect ist das Abhängigkeitsarray. TypeScript prüft, ob alle im Callback verwendeten Variablen im Array deklariert wurden.


Ereignisbehandlung

React-Ereignisse haben dedizierte Typdefinitionen.

src/components/Form.tsx

import React, { useState } from "react";

const Form: React.FC = () => {
    // Zustand vom Typ string
    const [name, setName] = useState<string>("");

    // Ereignisbehandlung für Formularübermittlung
    const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
        e.preventDefault();  // Standardübermittlung des Formulars verhindern
        console.log("Absenden:", name);
    };

    // Ereignisbehandlung für Eingabeänderungen
    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        setName(e.target.value);
    };

    return (
        <form onSubmit={handleSubmit}>
            <input
                type="text"
                value={name}
                onChange={handleChange}
                placeholder="Name eingeben"
            />
            <button type="submit">Absenden</button>
        </Form>
    );
};

export default Form;

Ausführungsergebnis:

Form 组件渲染成功

Event-Typen:React stellt Typen für jedes DOM-Ereignis bereit, wie FormEvent, ChangeEvent, MouseEvent usw.


Hinweise

  • React.FC:Empfohlen zu verwenden, um vollständige Typunterstützung zu erhalten
  • Props-Schnittstelle:Props-Typen für jede Komponente definieren
  • useState-Generics:Komplexe Typen müssen explizit angegeben werden
  • Event-Typen:Die von React bereitgestellten Event-Typen verwenden

Best Practices:Typdefinitionen und Komponenten in derselben Datei ablegen oder sie zentral in einem types-Verzeichnis verwalten.


Zusammenfassung

TypeScript verbessert die React-Entwicklungserfahrung erheblich.

  • React.FC:Standardtyp für React-Funktionskomponenten
  • Props:Interface verwenden, um Komponenten-Props zu definieren
  • useState:Generische Parameter verwenden, um den State-Typ anzugeben
  • useEffect:Vollständige Typunterstützung
  • Ereignisse:React-Event-Typen verwenden, um any zu vermeiden

Vorschlag:Verwende TypeScript direkt in neuen Projekten, was Laufzeitfehler deutlich reduzieren kann.

Andere Erweiterungen