Function Components vs React.FC
in TypeScript: Eine sachliche Diskussion
React und TypeScript starten gemeinsam ein Projekt. TypeScript sagt: „Ich kümmere mich um die Typen.“ React sagt: „Ich kümmere mich um das Rendering.“ Und irgendwann fragt jemand:
Sollten wir
React.FC
verwenden oder die Funktion einfach direkt typisieren?
Das ist eine vernünftige Frage. Auf den ersten Blick wirkt React.FC
poliert, offiziell – ja sogar anspruchsvoll. Fast so, als würde es deinem Code ein Glas Wein einschenken und sagen: „Lass uns diese Komponente elegant machen.“ Doch unter der Oberfläche bringt es ein paar Altlasten mit, die moderne TypeScript größtenteils hinter sich gelassen hat.
Werfen wir einen genaueren Blick darauf.
Die zwei Stile
Die einfache Funktionskomponente
type Props = { title: string };
function MyComponent({ title }: Props) {
return <h1>{title}</h1>;
}
Sauber, klar und leicht verständlich. Wie ein schwarzer Kaffee: ohne Schnickschnack, tut einfach seinen Zweck.
Oder, wenn du Pfeilfunktionen bevorzugst:
const MyComponent = ({ title }: Props) => {
return <h1>{title}</h1>;
};
Beide Varianten sind gültig, gut lesbar und entsprechen den aktuellen Best Practices.
Die React.FC Variante
import { FC } from 'react';
type Props = { title: string };
const MyComponent: FC<Props> = ({ title }) => {
return <h1>{title}</h1>;
};
Diese Version umgibt die Komponente mit einem generischen Typ. Sie wirkt „offizieller“ und wenn du kürzlich die Utility-Typen von TypeScript entdeckt hast, fühlt es sich vielleicht wie ein natürlicher Fit an – als hättest du gerade einen geheimen Club geöffnet. Aber manchmal haben geheime Clubs Kleingedrucktes.
Was React.FC tatsächlich macht
React.FC (kurz für React.FunctionComponent) ist ein Hilfstyp, der eine Funktionskomponente beschreibt. Er bietet einige Standardverhalten:
- Das
children
-Prop ist standardmäßig immer enthalten, ob du es willst oder nicht. - Es kann in manchen Editoren den Autocomplete gelegentlich verbessern.
- Es kann den Rückgabetyp der Funktion etwas expliziter machen, auch wenn das in der Praxis selten relevant ist.
Das sind eher bescheidene Komfortfunktionen, die in früheren Tagen von React + TypeScript nützlicher waren. Aber die Zeiten haben sich geändert, und heute stehen diese „Features“ oft eher im Weg als dass sie helfen.
Warum es aus der Mode kommt
Man könnte sagen, React.FC ist die Cargo-Hose von TypeScript – viele Taschen, von denen aber die meisten ungenutzt bleiben.
- Implizite children
Jede Komponente erhält ein children
-Prop, egal ob sie es will oder nicht. Das kann zu verwirrenden Bugs führen, wenn Entwickler annehmen, dass children
gültig sind, nur weil der Typ das sagt. (Spoiler: Das müssen sie nicht sein.)
- Umständlich mit Generics
Wenn deine Komponente generische Typen verwenden muss, macht React.FC die Sache meist eher komplizierter als einfacher. Die Syntax wird umständlich, und TypeScript wird weniger hilfreich, nicht mehr.
- Verbosität ohne Klarheit
const MyComponent: FC<Props>
zu schreiben ist länger und möglicherweise weniger klar als die Props einfach direkt zu typisieren.
- Kein notwendiger Schritt mehr
Die ursprünglichen Gründe für React.FC – Editorunterstützung, JSX-Inferenz – wurden mittlerweile größtenteils durch Verbesserungen in TypeScript gelöst. Was früher ein praktischer Workaround war, ist heute eher ein Relikt.
Ein direkter Vergleich
Merkmal | function Component() | const Component: FC |
---|---|---|
Enthält children? | Nur wenn deklariert | Immer enthalten |
Unterstützt Generics? | Elegant | Nicht ohne Aufwand |
Verbosität? | Minimal | Deutlich mehr |
Editor-Support? | Ausreichend | In bestimmten Fällen etwas besser |
Empfehlenswert? | Ja | Nicht mehr |
Der empfohlene Ansatz
Der Konsens in der Community ist einfach: Tipisiere deine Props direkt. Wenn deine Komponente children
akzeptieren soll, sag es explizit. Wenn nicht, dann eben nicht. Diese Ehrlichkeit wird dein zukünftiges Ich zu schätzen wissen.
type Props = {
title: string;
children?: React.ReactNode;
};
const MyComponent = ({ title, children }: Props) => (
<div>
<h1>{title}</h1>
{children}
</div>
);
Es ist explizit. Es ist wartbar. Und es tut nicht so, als ob deine Komponente children
handhabt, wenn sie es nicht tut.
Gibt es Situationen, in denen FC noch Sinn macht?
Gelegentlich. Wenn du in einem Legacy-Code arbeitest, der stark auf React.FC setzt, kann Konsistenz wichtiger sein als alles neu zu schreiben. Wenn du schnell Komponenten mocken möchtest und dich nicht um die Typisierung von children
kümmern willst, kann FC noch ein praktischer Shortcut sein.
Aber generell sind das Ausnahmen, die die Regel bestätigen.
Zum Abschluss
React.FC ist nicht falsch – es ist nur nicht mehr notwendig. Modernes TypeScript hat die Typisierung von React-Komponenten einfacher und vorhersagbarer gemacht, ganz ohne React.FC.
Beim nächsten Mal, wenn du zu FC greifen willst, halte kurz inne und überlege, ob du wirklich einen Mehrwert schaffst – oder nur zusätzliche Schichten hinzufügst. Meistens wird dir eine einfache, typisierte Funktion besser dienen.
In der Softwareentwicklung – wie im Leben – gewinnt Klarheit vor Cleverness. Und weniger Überraschungen bedeuten meistens weniger Bedauern.