paint-brush
So migrieren Sie ein React-Projekt von JavaScript nach TypeScriptby@leandronnz
10,806
10,806

So migrieren Sie ein React-Projekt von JavaScript nach TypeScript

Leandro Nuñez24m2023/10/19
Read on Terminal Reader

Die Migration eines React-Projekts von Javascript zu TypeScript ist nicht nur ein bloßes „Suchen und Ersetzen“ von .js-Dateien durch .tsx. Es handelt sich um einen strategischen Schritt, bei dem es darum geht, neue Konventionen zu erlernen, Typen tiefgreifend zu verstehen und vor allem die Art und Weise zu ändern, wie wir über die Zuverlässigkeit und Konsistenz unseres Codes denken. Hier ein paar Anmerkungen: Sicherheitsnetz: TypeScript hat eine Sicherheitsschicht in unser Projekt eingeführt, die Fehler erkennt, bevor sie zur Laufzeit verheerende Auswirkungen haben. Sobald Sie sich daran gewöhnt haben, verändert dieses Sicherheitsnetz das Vertrauen in Ihren Code und die allgemeine Entwicklungsgeschwindigkeit grundlegend. Klarere Kommunikation: Mit Typen kommuniziert unser Code jetzt expliziter. Unabhängig davon, ob Sie Ihren Code noch einmal durchgehen oder ein neues Teammitglied versucht, Ihre Komponentenstrukturen zu verstehen, TypeScript dient als zusätzliche Dokumentationsebene. Refactoring-Vertrauen: Angst vor Refactoring? Nun, TypeScript steht Ihnen zur Seite. Da Typen Verträge innerhalb Ihres Codes sicherstellen, werden viele potenzielle Fehler während der Refactoring-Phasen erkannt, was den Prozess weniger entmutigend macht. Gemeinschaft und Ökosystem: Die Einführung von TypeScript öffnet Türen zu einem florierenden Ökosystem. Von typisierten Bibliotheken auf DefinitelyTyped bis hin zu endlosem Support in Community-Foren und einer optimierten Paketintegration von Drittanbietern sind Sie in guter Gesellschaft. Lernkurve: Ja, TypeScript führt eine Lernkurve ein. Es gab wahrscheinlich Momente der Frustration, der Verwirrung über Typen und Schnittstellen oder des Ringens mit dem Compiler. Aber wenn Sie auf Ihre Reise zurückblicken, werden Sie sehen, wie viel besser Sie Ihren Code und sein Verhalten jetzt verstehen.
featured image - So migrieren Sie ein React-Projekt von JavaScript nach TypeScript
Leandro Nuñez HackerNoon profile picture
0-item


Inhaltsverzeichnis

  • Einführung

  • Warum migrieren? Die Vorteile verstehen

  • Bevor Sie beginnen: Voraussetzungen

  • Initiieren der Migration: Einrichten von TypeScript in Ihrem Projekt

  • Refactoring von Reaktionskomponenten

  • Statusverwaltung und Kontext-API

  • Routing und asynchrone Vorgänge

  • Testen in TypeScript

  • Umgang mit Nicht-TypeScript-Paketen

  • Best Practices und häufige Fallstricke

  • Abschluss

  • Zusätzliche Ressourcen



Einführung

Hallo, liebe Entwickler! Es ist aufregend, Sie hier zu sehen, bereit, den Übergang von JavaScript zu TypeScript in unseren React-Projekten zu erkunden.


Wenn Sie mit JavaScript gearbeitet haben, wissen Sie, dass es wie dieses alte, bequeme Paar Schuhe ist – ein wenig abgenutzt, manchmal unvorhersehbar, aber vertraut. TypeScript ist jedoch wie ein Schuh-Upgrade mit benutzerdefinierten Einlegesohlen; Es ist das gleiche Lauferlebnis, aber mit zusätzlicher Unterstützung.


Was ist also der Hype um TypeScript?


Nun, im Wesentlichen handelt es sich um JavaScript, aber mit einer guten Portion zusätzlicher Funktionen, von denen die Typprüfung die wichtigste ist.


Stellen Sie sich vor, dass das Codieren ohne diese lästigen undefined is not a function aus heiterem Himmel auftritt. Das ist die Art von Frieden, die TypeScript in Ihr Leben bringt.


In diesem Leitfaden erläutern wir das Warum und Wie der Integration von TypeScript in Ihr React-Projekt.


Warum reagieren? Weil es großartig ist und wir es natürlich lieben. Aber auch die Kombination des komponentenbasierten Ansatzes von React mit den Typprüfungsfunktionen von TypeScript sorgt für ein äußerst effizientes und angenehmes Programmiererlebnis.


Hier ist ein kleiner Vorgeschmack darauf, wie das Hinzufügen von TypeScript zu einem Projekt aussieht. In einer typischen JavaScript-Komponente hätten Sie Folgendes:

 // JavaScript way function Greeting({ name }) { return <h1>Hello, {name}</h1>; }


Mit TypeScript führen wir eine Möglichkeit ein, um sicherzustellen, dass name immer als Zeichenfolge behandelt wird:

 // TypeScript style type Props = { name: string; }; function Greeting({ name }: Props) { return <h1>Hello, {name}</h1>; }


Beachten Sie den type Props Teil?


Auf diese Weise sagt TypeScript: „Hey, ich schaue zu; stellen Sie besser sicher, dass name ein String ist!“ Es ist eine einfache Änderung mit tiefgreifenden Auswirkungen. Sie haben jetzt einen Schutzengel, der typbezogene Fehler aktiv verhindert und Ihren Code robuster und vorhersehbarer macht.


Aber das ist nur ein kleiner Einblick. Es gibt eine ganze Welt von Vorteilen und Praktiken mit TypeScript, die wir in diesem umfassenden Leitfaden näher erläutern. Von der Einrichtung Ihrer Umgebung über die Umgestaltung von Komponenten und Requisiten bis hin zu Best Practices zur Vermeidung häufiger Fallstricke haben wir viel zu bieten. Also schnall dich an und lass uns diese Show auf die Straße bringen!




Warum migrieren? Die Vorteile verstehen

Wenn Sie über die Umstellung von JavaScript auf TypeScript nachdenken, insbesondere in Ihren React- Projekten, sind Sie nicht der Einzige, der sich fragt: „Lohnt sich der Aufwand wirklich?“ Die Umstellung der Sprache eines gesamten Projekts ist keine leichte Aufgabe. Es erfordert Anstrengung, Lernen und zunächst eine etwas verlangsamte Produktivität. Warum also wechseln Entwickler? Lassen Sie uns die zwingenden Gründe aufschlüsseln.


1. Fehler früher erkennen: Statische Typprüfung

Das Kernmerkmal von TypeScript ist sein statisches Typsystem. Im Gegensatz zu JavaScript, das dynamisch typisiert wird, können Sie mit TypeScript Typen für Ihre Variablen, Funktionsparameter und zurückgegebenen Werte angeben. Was ist der Vorteil? Fehler werden während der Entwicklung erkannt, lange bevor der Code auch nur annähernd in Produktion geht.


Betrachten Sie ein einfaches Beispiel:

 // In JavaScript function createGreeting(name) { return `Hello, ${name}`; } // You might not catch this typo until runtime const greeting = createGreeting(123); console.log(greeting); // "Hello, 123" - Wait, that's not right!


Sehen wir uns nun an, wie TypeScript hilft:

 // In TypeScript function createGreeting(name: string): string { return `Hello, ${name}`; } // TypeScript will flag this immediately - '123' is not a string! const greeting = createGreeting(123);


Mit TypeScript wäre dieser harmlos aussehende Fehler sofort erkannt worden, sodass Sie sich des Missgeschicks in dem Moment bewusst wären, in dem es auftritt. Auf diese Weise wird die Rückkopplungsschleife verkürzt und Sie müssen sich nicht den Kopf zerbrechen, wenn Sie auf seltsame Fehler in Ihrer Produktionsumgebung stoßen.


2. Verbessern Sie die Qualität und Verständlichkeit des Codes

Die Durchsetzung der Typisierung durch TypeScript bedeutet, dass jeder andere Entwickler (oder sogar Ihr künftiger Entwickler) auf einen Blick erkennen kann, welche Art von Daten eine Funktion erwartet und was sie zurückgibt. Diese Klarheit macht Codebasen lesbarer und selbstdokumentierender.


Stellen Sie sich vor, Sie stoßen auf eine JavaScript-Funktion, die von einem Kollegen geschrieben wurde:

 function calculateTotal(items) { // ... complicated logic ... }


Sie müssten wahrscheinlich die Funktion durchforsten oder herausfinden, wo sie verwendet wird, um zu verstehen, welche items es sein sollten. Bei TypeScript ist sofort klar:

 type Item = { price: number; quantity: number; }; // Now we know exactly what to expect! function calculateTotal(items: Item[]): number { // ... complicated logic ... }


3. Erweiterte Editor-Unterstützung

TypeScript hebt die Entwicklererfahrung auf ein neues Niveau, indem es Texteditoren und IDEs durch verbesserte Autovervollständigung, Refactoring und Debugging verbessert. Diese Integration ist möglich, weil TypeScript sein Verständnis Ihres Codes mit Ihrem Editor teilen kann.

Sie werden dies erleben, wenn Ihr Editor Methodennamen vorschlägt, Informationen zu Funktionsparametern bereitstellt oder Sie vor falscher Funktionsverwendung warnt. Es ist, als hätte man einen Co-Piloten, der mit zusätzlicher Sicherheit durch den Code navigiert.


4. Einfachere Zusammenarbeit

In einer Teamumgebung glänzt TypeScript, indem es dabei hilft, bestimmte Standards und Strukturen in der gesamten Codebasis durchzusetzen. Wenn mehrere Entwickler zu einem Projekt beitragen, stellen die strengen Regeln von TypeScript sicher, dass sich alle an die gleichen Codierungsrichtlinien halten, was die Zusammenarbeit reibungsloser macht. Es handelt sich um eine gemeinsame Sprache, die auf ganzer Linie „Qualität und Konsistenz“ ausdrückt.


5. Machen Sie Ihren Code zukunftssicher

JavaScript entwickelt sich weiter und TypeScript möchte mit den neuesten Funktionen Schritt halten. Durch die Verwendung von TypeScript können Sie mit der Nutzung der nächsten Generation von JavaScript-Funktionen beginnen, bevor sie sich allgemein durchsetzen, und so sicherstellen, dass Ihr Projekt modern und auf dem neuesten Stand bleibt.


Zusammenfassend lässt sich sagen, dass es bei der Migration zu TypeScript nicht nur darum geht, Fehler früher zu erkennen; es geht um eine ganzheitliche Verbesserung Ihres Codierungsprozesses. Von einer besseren Teamzusammenarbeit bis hin zur Zukunftssicherheit Ihrer Projekte bietet TypeScript eine solide Grundlage für die Erstellung zuverlässiger, skalierbarer und wartbarer Anwendungen.


Der Wechsel mag auf den ersten Blick entmutigend erscheinen, aber angesichts der oben dargelegten Vorteile ist es klar, warum TypeScript für viele Entwickler weltweit zum Favoriten geworden ist. Bereit zum Eintauchen? Lasst uns fortfahren!



Bevor Sie beginnen: Voraussetzungen

Alles klar, Sie sind also bereit, mit Ihrem React-Projekt auf TypeScript umzusteigen? Tolle Entscheidung!


Doch bevor wir uns mit dem eigentlichen Prozess befassen, müssen wir sicherstellen, dass einige Dinge vorhanden sind.

Betrachten Sie dies als unsere Vorbereitungsphase, in der wir alle unsere Werkzeuge vorbereiten, damit der Übergangsprozess reibungslos verläuft.


Folgendes müssen Sie bereithalten:

1. Bestehendes React-Projekt

Das Wichtigste zuerst: Sie benötigen ein bestehendes React-Projekt. Mit diesem Projekt sollten Sie gerne experimentieren. Obwohl der Migrationsprozess recht unkompliziert ist, sollten Sie dies an einem Ort tun, an dem es in Ordnung ist, vorübergehende Unordnung zu verursachen.


 // Here's a simple React functional component in your project export default function Greeting({ name }) { return <h1>Hello, {name}!</h1>; }


Diese Komponente ist ein guter Ausgangspunkt – sie ist funktionsfähig, sie ist sauber und wir können auf einen Blick sehen, was vor sich geht.

2. Grundlegendes Verständnis von TypeScript

Sie müssen kein TypeScript-Guru sein, aber wenn Sie die Grundlagen verstehen, wird dieser Übergang viel einfacher.


Erfahren Sie, wie Sie Typen und Schnittstellen definieren und kennen Sie den Unterschied zwischen type und interface .

Ein paar Hausaufgaben reichen weit, glauben Sie mir.


 // A sneak peek into TypeScript syntax type Props = { name: string; // defining the 'name' expected to be a string }; // Your component in TypeScript would look like this import React, { FC } from 'react'; interface GreetingProps { name: string; } const Greeting: FC<GreetingProps> = ({ name }) => { return <h1>Hello, {name}!</h1>; } export default Greeting;


Sieh den Unterschied? Wir machen jetzt deutlich, was Greeting erwartet, wodurch unsere Komponente vorhersehbarer und einfacher zu handhaben ist.


3. Knoten und NPM/Garn

In Ihrer Entwicklungsumgebung sollte Node.js installiert sein, da wir npm oder yarn für die Verarbeitung unserer Pakete verwenden werden. Diese Anforderung ist gegeben, da Sie mit React arbeiten, aber es schadet nicht, sicher zu sein, oder?


 # Check if Node is installed node --version # Check if npm is installed npm --version # Or for yarn yarn --version


Ihr Terminal sollte Ihnen die aktuellen Versionen dieser Tools anzeigen und bestätigen, dass sie alle eingerichtet und einsatzbereit sind.


4. Code-Editor

Sie benötigen einen Code-Editor, der gut mit TypeScript umgehen kann. Visual Studio Code ist ein Publikumsliebling, da es über eine robuste integrierte TypeScript-Unterstützung verfügt, die den Entwicklungsprozess durch intelligente Codevervollständigung und Fehlerhervorhebung reibungsloser gestaltet.


5. Versionskontrolle

Dieser Schritt ist nicht obligatorisch, aber klug. Stellen Sie sicher, dass Ihr aktuelles Projekt mit Git unter Versionskontrolle steht. Wenn etwas schief geht (obwohl wir versuchen sicherzustellen, dass dies nicht der Fall ist), können Sie jederzeit zu einer früheren Version zurückkehren, ohne den Schlaf zu verlieren.


 # Check if git is installed git --version # If not, you need to initialize version control before proceeding git init git add . git commit -m "Pre-TypeScript commit"


Mit diesem Sicherheitsnetz können Sie beruhigt experimentieren und wissen, dass Ihr Rücken geschützt ist.


Das war’s mit unseren Voraussetzungen! Sie haben das Projekt, haben etwas TypeScript aufgefrischt, Ihre Umgebung ist bereit und Ihr Sicherheitsnetz ist vorhanden.


Jetzt sind wir bereit, in den Migrationsprozess einzutauchen. Lass uns die Kugel ins Rollen bringen!



Initiieren der Migration: Einrichten von TypeScript in Ihrem Projekt Refactoring von React-Komponenten

Okay, weiter zur nächsten Phase!


Wir haben die Bühne mit TypeScript bereitet, aber jetzt müssen wir uns die Hände schmutzig machen.


Es ist Zeit, unsere React-Komponenten umzugestalten. Dieser Schritt umfasst etwas mehr als nur das Ändern von Dateierweiterungen. Wir müssen unseren Komponentencode aktualisieren, um die Funktionen von TypeScript für ein robusteres, fehlerfreies Codierungserlebnis zu nutzen.

Lass uns eintauchen!


1. Dateierweiterungen ändern

Das Wichtigste zuerst: Benennen wir unsere Komponentendateien um. Bei diesem Vorgang wird die Erweiterung von .js in .tsx für Dateien geändert, die JSX-Code enthalten.


So können Sie dies in großen Mengen im Quellverzeichnis Ihres Projekts über die Befehlszeile tun:

 # For Unix-like shells, navigate to your source folder and run: find . -name "*.js" -exec bash -c 'mv "$0" "${0%.js}.tsx"' {} \; # If you're using PowerShell (Windows), navigate to your source folder and run: Get-ChildItem -Filter *.js -Recurse | Rename-Item -NewName { $_.Name -replace '\.js$','.tsx' }


Diese Befehle suchen nach allen .js Dateien im Quellverzeichnis Ihres Projekts und benennen sie in .tsx um. Es ist, als würden Sie Ihren Dateien sagen: „Willkommen in der TypeScript-Welt!“


2. Geben Sie Ihre Komponenten ein

Lassen Sie uns nach der Umbenennung unserer Dateien den Code in Angriff nehmen. Wir beginnen mit einer einfachen Funktionskomponente in JavaScript:

 // Before: MyComponent.js import React from 'react'; function MyComponent({ greeting }) { return <h1>{greeting}, world!</h1>; }


Lassen Sie uns dies nun umgestalten, um TypeScript zu verwenden:

 // After: MyComponent.tsx import React, { FC } from 'react'; // Define a type for the component props interface MyComponentProps { greeting: string; } // Use the 'FC' (Functional Component) generic from React, with our props type const MyComponent: FC<MyComponentProps> = ({ greeting }) => { return <h1>{greeting}, world!</h1>; }


Was haben wir hier gemacht?


Wir haben eine Schnittstelle MyComponentProps definiert, um die Requisiten unserer Komponente zu beschreiben und so die Typsicherheit zu gewährleisten. Wenn wir sagen, dass greeting eine Zeichenfolge ist, schreit TypeScript uns an, wenn wir versuchen, stattdessen beispielsweise eine Zahl zu übergeben. Wir haben auch den FC Typ (kurz für Functional Component ) aus den Typdefinitionen von React verwendet, um sicherzustellen, dass TypeScript weiß, dass es sich um eine React-Komponente handelt.


3. Geben Sie useState und useEffect stark ein

Lassen Sie uns unsere Komponenten weiter verbessern, indem wir den Zuständen und Effekten Typen hinzufügen, die gemeinsame Merkmale funktionaler Komponenten darstellen.


Hier ist eine Komponente mit Zustand und einem Effekt:

 // Before: Counter.js import React, { useState, useEffect } from 'react'; function Counter() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }


Lassen Sie uns etwas TypeScript-Magie darüber streuen:

 // After: Counter.tsx import React, { useState, useEffect, FC } from 'react'; const Counter: FC = () => { // Declare the 'count' state variable with TypeScript const [count, setCount] = useState<number>(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(prevCount => prevCount + 1)}> Click me </button> </div> ); }


In unserer umgestalteten Komponente haben wir TypeScript ausdrücklich angewiesen, eine number für unseren count zu erwarten.


Dieses Detail verhindert lästige Fehler, bei denen wir versehentlich eine Zeichenfolge, ein Objekt oder, Gott bewahre, null anstelle unserer erwarteten Zahl erhalten.


Und los geht's!


Wir haben unsere React-Komponenten erfolgreich umgestaltet, um TypeScript zu verwenden. Durch die explizite Eingabe unserer Komponenten, Zustände und Requisiten erstellen wir eine vorhersehbarere und einfacher zu wartende Codebasis. Wir programmieren nicht nur; Wir fertigen ein Meisterwerk mit der Präzision, die es verdient.


Als nächstes werden wir uns eingehender mit komplexeren Szenarien befassen und erfahren, wie TypeScript uns dabei hilft!



Statusverwaltung und Kontext-API

Kommen wir nun zu den Einzelheiten der Zustandsverwaltung in React mit TypeScript. Wenn Sie die Kontext-API in einem JavaScript-Projekt verwendet haben, wissen Sie, dass es sich um eine leistungsstarke Funktion zum Weiterleiten von Daten durch den Komponentenbaum handelt, ohne dass Requisiten auf jeder Ebene manuell weitergegeben werden müssen. In TypeScript profitieren wir zusätzlich von der strikten Typisierung, die unsere Kontextdaten noch robuster und vorhersehbarer macht.


Bereit einzusteigen? Lass uns gehen!


1. Erstellen eines typisierten Kontexts

Zuerst erstellen wir einen neuen Kontext mit TypeScript. Dieser Kontext stellt sicher, dass jeder Standardwert, Anbieterwert oder Verbraucherkomponente unserem erwarteten Typ entspricht.


So definieren Sie einen grundlegenden Kontext in JavaScript:

 // Before: DataContext.js import React, { createContext, useState } from 'react'; export const DataContext = createContext(); export const DataProvider = ({ children }) => { const [data, setData] = useState(null); return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


Geben wir nun diesen Kontext mit TypeScript ein:

 // After: DataContext.tsx import React, { createContext, useState, FC, ReactNode } from 'react'; // First, we define a type for our context's state interface DataContextState { data: any; // Tip: Replace 'any' with the expected type of 'data' setData: (data: any) => void; // And here too, replace 'any' with the actual expected type } // We ensure our createContext() call is typed with the above interface export const DataContext = createContext<DataContextState | undefined>(undefined); // Now, let's create a provider component export const DataProvider: FC<{children: ReactNode}> = ({ children }) => { const [data, setData] = useState<any>(null); // Again, consider replacing 'any' with your actual data type // The context provider now expects a value that matches 'DataContextState' return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


Was wir hier gemacht haben, ist die Erstellung einer TypeScript-Schnittstelle, DataContextState , die unsere Kontextdaten strikt typisiert. Wir haben auch die Funktion createContext und die Komponente DataProvider typisiert und so sichergestellt, dass alles, von den Statusvariablen bis zu den Kontextwerten, mit unseren definierten Typen übereinstimmt.


2. Verwendung des typisierten Kontexts

Nachdem wir nun unseren typisierten DataContext haben, wollen wir sehen, wie wir ihn innerhalb einer Komponente nutzen können.


Wir müssen den useContext Hook verwenden, und so geht das:

 // ComponentUsingContext.tsx import React, { useContext, FC } from 'react'; import { DataContext } from './DataContext'; const ComponentUsingContext: FC = () => { // Here we're telling TypeScript to expect 'DataContextState' from our context const { data, setData } = useContext(DataContext) ?? {}; // This function would update the context state, triggering re-renders in consuming components const handleUpdateData = () => { const newData = { message: "Hello, TypeScript!" }; // This should match the structure of your data type setData(newData); }; return ( <div> <pre>{JSON.stringify(data, null, 2)}</pre> <button onClick={handleUpdateData}>Update Data</button> </div> ); };


In ComponentUsingContext greifen wir auf den Kontext zu und erwarten, dass TypeScript überprüft, ob der Wert mit DataContextState übereinstimmt. Unsere Funktion handleUpdateData zeigt, wie Sie den gemeinsamen Status aktualisieren können – alle Komponenten, die DataContext nutzen, werden beim Aufruf von setData mit den neuen Daten neu gerendert.


Durch die Verwendung von TypeScript mit der Kontext-API gewinnen wir die Gewissheit, dass unsere gemeinsame Statusverwaltung in der gesamten Anwendung konsistent ist. Der Compiler erkennt alle Diskrepanzen zwischen dem, was unser Kontext bereitstellt, und dem, was unsere Komponenten erwarten. Diese Synergie macht unseren Code zuverlässiger und unseren Entwicklungsprozess reibungsloser, sodass wir ganze Kategorien von Fehlern vermeiden können, auf die wir sonst stoßen könnten.


Machen Sie weiter so und denken Sie daran, ein wenig Tippen erspart Ihnen später viel Debugging!



Routing- und Async-Vorgangstests in TypeScript >

Nachdem wir nun gesehen haben, wie TypeScript verschiedene Aspekte unserer React-Anwendung verbessert, ist es an der Zeit, über einen weiteren wichtigen Bereich zu sprechen: das Testen.


Tests sind von grundlegender Bedeutung, um sicherzustellen, dass unsere App wie erwartet funktioniert, und TypeScript kann unsere Tests zuverlässiger und effizienter machen. Sehen wir uns an, welche Rolle TypeScript beim Testen spielt, insbesondere in einem React-Projekt.


1. Vorbereitung der Testphase

Bevor wir uns mit dem Code befassen, stellen Sie sicher, dass Sie die erforderlichen Bibliotheken zum Testen in einem React-Projekt installiert haben. Hier ist eine schnelle Einrichtung mit der Jest- und React-Testbibliothek, die häufig zusammen zum Testen von React-Anwendungen verwendet wird:

 npm install --save-dev jest @types/jest @testing-library/react @testing-library/jest-dom


Diese Bibliotheken bieten eine robuste Umgebung zum Schreiben von Unit- und Integrationstests. Betrachten wir nun zur Verdeutlichung ein reales Szenario.


2. Reales Testszenario: Benutzerbegrüßungskomponente

Stellen Sie sich vor, wir haben eine einfache Komponente in unserer App, die Benutzer basierend auf der Tageszeit begrüßt. Es handelt sich um eine funktionale Komponente, die den Namen des Benutzers als Requisite und die aktuelle Zeit als Status verwendet.


So könnte unsere UserGreeting Komponente aussehen:

 // UserGreeting.tsx import React, { FC, useState, useEffect } from 'react'; interface UserGreetingProps { name: string; } const UserGreeting: FC<UserGreetingProps> = ({ name }) => { const [currentHour, setCurrentHour] = useState(new Date().getHours()); const [greeting, setGreeting] = useState(''); useEffect(() => { // Determine the time of day and set the appropriate greeting if (currentHour < 12) { setGreeting('Good morning'); } else if (currentHour < 18) { setGreeting('Good afternoon'); } else { setGreeting('Good evening'); } }, [currentHour]); return ( <div> <h1>{greeting}, {name}!</h1> </div> ); } export default UserGreeting;


Jetzt müssen wir Tests schreiben, um sicherzustellen, dass sich unsere Komponente unter verschiedenen Bedingungen wie erwartet verhält. Unsere Testfälle bestätigen, dass je nach Tageszeit die passende Begrüßung angezeigt wird.


So können wir diese Tests mit der Jest and React Testing Library schreiben:

 // UserGreeting.test.tsx import React from 'react'; import { render, screen } from '@testing-library/react'; import UserGreeting from './UserGreeting'; describe('UserGreeting Component', () => { // Mock date for consistent testing const originalDate = Date; beforeAll(() => { const mockDate = new Date(2023, 10, 17, 14); // 2:00 PM global.Date = jest.fn(() => mockDate) as any; }); afterAll(() => { global.Date = originalDate; // Restore original Date object }); it('displays the correct greeting for the afternoon', () => { render(<UserGreeting name="Jordan" />); // Assert the greeting based on the mocked time of day expect(screen.getByText('Good afternoon, Jordan!')).toBeInTheDocument(); }); // Additional tests would repeat this process for other times of day, // ensuring our component behaves consistently. });


In diesem Skript rendern wir unsere Komponente mit einer festgelegten Zeit (vorgetäuscht auf 14:00 Uhr) und prüfen, ob sie wie erwartet „Guten Tag“ ausgibt. Wir können weitere Tests für andere Tageszeiten (morgens, abends) schreiben, um sicherzustellen, dass unsere Komponente vollständig abgedeckt ist.


Durch TypeScript stellen wir sicher, dass die Requisiten, die wir in unseren Tests an unsere Komponenten übergeben, den erwarteten Typen entsprechen. Auf diese Weise vermeiden wir Probleme mit falschen Requisiten, die zu falsch-negativen Ergebnissen in unseren Tests führen könnten, und stellen so sicher, dass unsere Tests robust und zuverlässig sind.


Die Verwendung von TypeScript beim Testen hilft dabei, Probleme frühzeitig im Entwicklungsprozess zu erkennen und unsere Apps robuster und wartbarer zu machen. Es ist eine Win-Win-Situation! Denken Sie daran, dass konsistente und umfassende Tests ein Markenzeichen einer qualitativ hochwertigen Softwareentwicklung sind. Weiter so!




Umgang mit Nicht-TypeScript-Paketen

Okay, lasst uns einen Bereich angehen, der Leute beim Umstieg auf TypeScript in einem React-Projekt oft stutzig macht: den Umgang mit JavaScript-Bibliotheken und -Paketen, die nicht in TypeScript geschrieben sind. Es ist ein häufiges Szenario. Sie haben Ihr TypeScript-Projekt zum Laufen gebracht und installieren dann ein Drittanbieterpaket, nur um festzustellen, dass sich Ihr TypeScript-Compiler beschwert. Mach dir keine Sorge; es gibt Lösungen.


1. Dem Problem begegnen

Hier ist ein typisches Szenario: Sie versuchen, ein Paket zu verwenden, das nicht standardmäßig über TypeScript-Unterstützung verfügt, und der TypeScript-Compiler beginnt, Fehler wie „Für Modul ‚Modulname‘ konnte keine Deklarationsdatei gefunden werden“ auszulösen. Klingt bekannt?


Dieses Problem entsteht, weil TypeScript auf Typdefinitionen angewiesen ist, um die Struktur von Bibliotheken und Paketen zu verstehen. Wenn diese Typdefinitionen fehlen, geht TypeScript etwas verloren. Aber keine Angst, wir haben Strategien, um damit umzugehen.

2. DefinitelyTyped verwenden

Eines der ersten Dinge, die Sie tun können, ist zu überprüfen, ob die Community über DefinitelyTyped Typdefinitionen für das Paket bereitgestellt hat. DefinitelyTyped ist ein riesiges Repository mit Typdefinitionen, das von der Community verwaltet wird.


So würden Sie Typen von DefinitelyTyped überprüfen und verwenden:


  1. Suchen Sie nach Typdefinitionen für Ihr Paket, indem Sie versuchen, diese mit npm zu installieren. Typdefinitionen auf DefinitelyTyped werden normalerweise mit dem Präfix @types/ versehen.
 npm install @types/package-name


Wenn Sie beispielsweise die lodash Bibliothek verwenden würden, würden Sie Folgendes ausführen:

 npm install @types/lodash


  1. Nach der Installation müssen Sie die Typen nirgendwo in Ihrem Projekt explizit importieren. TypeScript erkennt und verwendet sie automatisch, sodass Sie wie gewohnt Bibliotheken importieren und verwenden sowie automatische Vervollständigung und Typprüfung erhalten.


Was aber, wenn auf DefinitelyTyped keine Typdefinition verfügbar ist?


3. Erstellen Sie Ihre eigene Deklarationsdatei

Wenn DefinitelyTyped nicht über die benötigten Typdefinitionen verfügt, ist es an der Zeit, eine benutzerdefinierte Deklarationsdatei zu erstellen. Obwohl dieser Ansatz mehr Aufwand erfordert, stellt er sicher, dass Ihr TypeScript-Projekt reibungslos mit der JavaScript-Bibliothek funktioniert.


Hier ist eine vereinfachte Version dessen, was Sie tun könnten:


  1. Erstellen Sie eine neue Datei mit der Erweiterung .d.ts im Quellverzeichnis (oder types ) Ihres Projekts. Dies könnte so etwas wie declarations.d.ts sein.


  2. In dieser Datei möchten Sie das Modul deklarieren und möglicherweise die Grundstruktur skizzieren, die Sie von der Bibliothek erwarten. Zum Beispiel:

 // This is a simplistic type declaration file for a hypothetical package. // We declare the module so TypeScript recognizes it. declare module 'name-of-untyped-package' { // Below, we're declaring a very basic structure. It's saying // there's a function we're expecting to exist, which returns any. // Ideally, you'd want to flesh this out with more specific types // if you know them or as you learn more about the library. export function functionName(arg: any): any; // You can continue to define the shapes of other functions or variables // you expect to exist within the package. The more detailed you are here, // the more helpful your type checking will be. }


Diese selbstgemachte Deklarationsdatei wird nicht so umfassend sein wie ein vollständiger Satz von Typdefinitionen, aber sie sagt TypeScript: „Vertrauen Sie mir, ich weiß, dass dieses Modul existiert und es diese Funktionen/Variablen bereitstellt.“ Von hier aus können Sie bei Bedarf detailliertere Definitionen erstellen.


Denken Sie daran, dass der Umgang mit Nicht-TypeScript-Paketen eine kleine Hürde sein kann, aber diese Strategien stellen sicher, dass Ihr TypeScript-Projekt robust bleibt und die von uns gewünschte Typsicherheit und Vorhersagbarkeit genießt. Es kommt auf das Vertrauen in Ihre Codebasis an!



Best Practices und häufige Fallstricke

Beim Wechsel zu TypeScript in Ihrem React-Projekt geht es nicht nur darum, Dateierweiterungen zu ändern und Typanmerkungen hinzuzufügen. Es geht auch darum, Ihre Denkweise und Entwicklungspraktiken anzupassen, um das Beste aus den Angeboten von TypeScript herauszuholen und gleichzeitig häufige Stolpersteine zu vermeiden. Lassen Sie uns einige Best Practices und häufige Fallstricke besprechen, denen Sie auf dieser Reise begegnen könnten.

1. Best Practices

1.1 Verlassen Sie sich auf Typinferenz

Auch wenn es verlockend sein mag, alles mit Anmerkungen zu versehen, ist eine der Stärken von TypeScript die Typinferenz. Es ist oft unnötig, jedem Teil Ihres Codes explizite Typen hinzuzufügen.

 // Instead of this: let x: number = 0; // You can rely on type inference: let x = 0; // TypeScript knows this is a number

Übermäßiges Annotieren kann dazu führen, dass Ihr Code ausführlicher wird, ohne dass dadurch ein Mehrwert entsteht. Vertrauen Sie TypeScript, um Typen abzuleiten, wo immer es möglich ist.

1.2 Nutzen Sie Dienstprogrammtypen

Dienstprogrammtypen bieten flexible Möglichkeiten zur Handhabung von Typen in verschiedenen Szenarien. Sie können Ihnen viel Aufwand ersparen und Ihre Typenbearbeitung effizienter gestalten.

 // Example of using Partial to make all properties in an object optional function updateProfile(data: Partial<UserProfile>) { // function implementation } // Now you can pass only the parts of UserProfile you need to update updateProfile({ username: "newUserName" }); // This is valid

Partial , Readonly , Pick und andere Dienstprogrammtypen können unglaublich praktisch sein.

1.3 Verwenden Sie Aufzählungen für bekannte Konstantensätze

Wenn Sie über eine Eigenschaft verfügen, die nur bestimmte Werte annehmen kann, kann die Verwendung von enum Ihre Absicht deutlich machen und gleichzeitig eine Validierung dieser Werte ermöglichen.

 enum UserRole { Admin = 'ADMIN', User = 'USER', Guest = 'GUEST', } // Now UserRole can only be one of the values defined in the enum function assignRole(role: UserRole) { // function implementation }

1.4 Bevorzugen Sie Schnittstellen für die Objektstrukturdefinition

Während type und interface häufig austauschbar verwendet werden können, sorgt die Verwendung interface zum Definieren der Struktur von Objekten oder Klassen dafür, dass Ihr Code besser lesbar ist und bessere Fehlermeldungen bereitgestellt werden.

 interface UserProfile { username: string; email: string; // More properties... }


2. Häufige Fallstricke

2.1 Überbeanspruchung any

Durch die Verwendung any werden die Vorteile von TypeScript zunichte gemacht, da die Typprüfung umgangen wird. Auch wenn es wie eine schnelle Lösung erscheint, macht es Ihren Code weniger sicher und vorhersehbar.

 // Try to avoid this: let userData: any = fetchData(); // Instead, define a type for the data you expect: let userData: UserProfile = fetchData();

2.2 Ignorieren von Compiler-Warnungen

Die Compiler-Warnungen von TypeScript helfen Ihnen dabei. Das Ignorieren dieser Punkte kann zu den gleichen Fehlern und Problemen führen, die Sie durch die Verwendung von TypeScript vermeiden möchten.

2.3 Sich in komplexen Typen verlieren

Um Typen präzise zu machen, erstellen Entwickler manchmal unglaublich komplexe Typdefinitionen, die schwer zu verstehen und zu pflegen sind. Wenn Ihre Typen immer komplizierter werden, ist es möglicherweise an der Zeit, Ihren Code zu vereinfachen oder umzugestalten.

2.4 Bibliothekstypen von Drittanbietern vergessen

Wenn Sie Bibliotheken von Drittanbietern verwenden, prüfen Sie immer, ob auf DefinitelyTyped vorhandene TypeScript-Typen vorhanden sind. Wenn Sie dies nicht tun, können Sie auf die Typsicherheitsfunktionen dieser Bibliotheken verzichten.

Zusammenfassend lässt sich sagen, dass die Einführung von TypeScript mehr ist als nur die Verwendung einer neuen Syntax; Es geht darum, neue Praktiken einzuführen, die dabei helfen, Fehler zu vermeiden, den Code lesbarer zu machen und die Wartung zu verbessern. Vermeiden Sie häufige Fallen und denken Sie daran, dass das Ziel darin besteht, saubereren, zuverlässigeren und wartbareren Code zu schreiben!




Abschluss

Nun, Leute, wir haben das Ende unserer TypeScript-Migrationsreise erreicht. Es war eine ziemliche Fahrt, nicht wahr? Wir begannen mit der großen Frage nach dem „Warum“ und befassten uns mit den Einzelheiten der tatsächlichen Umstellung eines React-Projekts von JavaScript auf TypeScript. Von der Einrichtung Ihrer TypeScript-Umgebung über das Refactoring von Komponenten, die Verwaltung von Zuständen, die Handhabung von Routen bis hin zum Umgang mit diesen lästigen Nicht-TypeScript-Paketen haben wir viel abgedeckt.


Wenn man über diese Reise nachdenkt, wird klar, dass die Migration zu TypeScript nicht nur ein bloßes „Suchen und Ersetzen“ von .js Dateien durch .tsx ist. Es handelt sich um einen strategischen Schritt, bei dem es darum geht, neue Konventionen zu erlernen, die Typen gründlich zu verstehen und vor allem die Art und Weise zu ändern, wie wir über die Zuverlässigkeit und Konsistenz unseres Codes denken.


Hier sind ein paar Erkenntnisse zum Abschluss:

  1. Sicherheitsnetz : TypeScript hat eine Sicherheitsschicht in unser Projekt eingeführt, die Fehler erkennt, bevor sie zur Laufzeit verheerende Auswirkungen haben. Sobald Sie sich daran gewöhnt haben, verändert dieses Sicherheitsnetz das Vertrauen in Ihren Code und die allgemeine Entwicklungsgeschwindigkeit grundlegend.


  2. Klarere Kommunikation : Mit Typen kommuniziert unser Code jetzt expliziter. Ganz gleich, ob Sie Ihren Code überarbeiten oder ein neues Teammitglied versucht, Ihre Komponentenstrukturen zu verstehen, TypeScript dient als zusätzliche Dokumentationsebene.


  3. Refactoring-Vertrauen : Angst vor Refactoring? Nun, TypeScript steht Ihnen zur Seite. Da Typen Verträge innerhalb Ihres Codes sicherstellen, werden viele potenzielle Fehler während der Refactoring-Phasen erkannt, was den Prozess weniger entmutigend macht.


  4. Gemeinschaft und Ökosystem : Die Einführung von TypeScript öffnet Türen zu einem florierenden Ökosystem. Von typisierten Bibliotheken auf DefinitelyTyped bis hin zu endlosem Support in Community-Foren und einer optimierten Paketintegration von Drittanbietern sind Sie in guter Gesellschaft.


  5. Lernkurve : Ja, TypeScript führt eine Lernkurve ein. Es gab wahrscheinlich Momente der Frustration, der Verwirrung über Typen und Schnittstellen oder des Ringens mit dem Compiler. Aber wenn Sie auf Ihre Reise zurückblicken, werden Sie sehen, wie viel besser Sie Ihren Code und sein Verhalten jetzt verstehen.


Denken Sie daran, dass der Übergang zu TypeScript kein Sprint ist; es ist ein Marathon. Anfangs mag es ein paar Hürden geben, aber die langfristigen Fortschritte bei der Codequalität, Vorhersagbarkeit und Wartbarkeit sind die Mühe durchaus wert.


Während Sie Ihre Entwicklungsreise fortsetzen, erkunden, lernen und teilen Sie Ihre Erfahrungen mit TypeScript. Jede Herausforderung ist eine Gelegenheit zum Lernen. Ihr zukünftiges Ich (und Ihr Team) werden Ihnen für die robuste, typsichere und wesentlich wartbarere Codebasis danken, die Sie heute pflegen.


Vielen Dank, dass Sie mich bei dieser Erkundung von TypeScript mit React begleitet haben. Codieren Sie weiter, verbessern Sie sich weiter und, was am wichtigsten ist: Genießen Sie den Prozess!


In Verbindung bleiben

Wenn Ihnen dieser Artikel gefallen hat und Sie mehr über die Webentwicklung erfahren möchten, können Sie sich gerne auf verschiedenen Plattformen mit mir in Verbindung setzen:

dev.to

hackernoon.com

hashnode.com

twitter.com


Ihr Feedback und Ihre Fragen sind jederzeit willkommen.

Lernen Sie weiter, programmieren Sie und erstellen Sie fantastische Webanwendungen.


Viel Spaß beim Codieren!



Zusätzliche Ressourcen

Auch wenn unser Leitfaden zu Ende ist, endet Ihr Abenteuer mit TypeScript hier nicht. Die Welt von TypeScript ist riesig und bietet eine Fülle von Ressourcen, die es zu erkunden, daraus zu lernen und zu denen man beitragen kann. Nachfolgend finden Sie einige wertvolle Ressourcen, die Ihnen dabei helfen können, Ihr Verständnis zu vertiefen und Sie in der TypeScript-Community auf dem Laufenden zu halten.


  1. Offizielle Dokumentation zu TypeScript : Es gibt keinen besseren Ort, um TypeScript zu erkunden als die offizielle Website . Es ist vollgepackt mit ausführlicher Dokumentation, Beispielen und Erklärungen zu verschiedenen Funktionen.


  2. DefinitelyTyped : Bei der Arbeit mit Bibliotheken von Drittanbietern ist DefinitelyTyped ein Lebensretter. Es handelt sich um ein riesiges Repository hochwertiger TypeScript-Typdefinitionen.


  3. React TypeScript Cheatsheet : Dieses umfassende Cheatsheet richtet sich speziell an React-Entwickler, die auf TypeScript umsteigen, und deckt gängige Muster und Praktiken ab.


  4. TypeScript Deep Dive : Ein ausgezeichnetes Online-Buch, das eine detaillierte Erkundung von TypeScript bietet. Deep Dive erklärt das Wesentliche von TypeScript mit Schwerpunkt auf praktischen Szenarien.


  5. TypeScript-GitHub-Repository : Treten Sie mit der Community in Kontakt und bleiben Sie über die neuesten Entwicklungen in TypeScript auf dem Laufenden, indem Sie das offizielle TypeScript-GitHub-Repository besuchen.


  6. Stack Overflow : Das TypeScript-Tag auf Stack Overflow ist eine Drehscheibe für häufige (und ungewöhnliche) Abfragen und nuancierte Anwendungsfälle, auf die Entwickler weltweit stoßen. Es ist eine Goldgrube an praktischen Erkenntnissen.


  7. TypeScript Weekly : TypeScript Weekly ist ein kuratierter Newsletter, der die neuesten Artikel, Tipps und Ressourcen direkt in Ihren Posteingang liefert.


  8. Reddit- und Discord-Kanäle : Communities auf Plattformen wie Reddits r/typescript und verschiedenen Discord-Kanälen bieten lebhafte Diskussionen, Neuigkeiten und Threads zur Problemlösung im Zusammenhang mit TypeScript.


  9. Offizieller TypeScript-Blog : Ankündigungen, ausführliche Einblicke und Tutorials vom TypeScript-Team finden Sie im offiziellen Blog .


  10. Online-Codierungsplattformen : Interaktive Lernerfahrungen über Plattformen wie Codecademy , freeCodeCamp und Scrimba bieten praxisorientierte TypeScript-Kurse.


Denken Sie daran: Gemeinschaften leben von der Teilnahme. Zögern Sie nicht, Fragen zu stellen, Antworten beizutragen oder Ihre Lösungen und Erfahrungen zu teilen. Das gesammelte Wissen aus Community-Foren, offizieller Dokumentation und kontinuierlicher Praxis wird Sie zur Beherrschung von TypeScript führen.


Viel Spaß beim Codieren!