Inzwischen beginne ich kein Projekt mehr, das über einen kleinen Prototypen hinausgeht, ohne auf TypeScript zu setzen. Hier sind vier Gründe, warum TypeScript zu meinem unverzichtbaren Begleiter geworden ist.
Bewusster Umgang mit null
/ undefined
Die größte Fehlerquelle in JavaScript sind Zugriffe auf nicht verfügbare Elemente: Uncaught TypeError: Cannot read property of undefined
. TypeScript zwingt einen dazu, sich schon während der Entwicklung Gedanken zu machen und nicht erst beim Ausführen und Testen des Codes darauf zu stoßen.
Beispiel:
1// JavaScript
2function getUserName(user) {
3 return user.name; // Potential für undefined-Fehler
4}
5
6// TypeScript
7interface User {
8 name: string;
9}
10
11function getUserName(user: User) {
12 return user.name; // Fehler wird bereits während der Entwicklung erkannt
1// JavaScript
2function getUserName(user) {
3 return user.name; // Potential für undefined-Fehler
4}
5
6// TypeScript
7interface User {
8 name: string;
9}
10
11function getUserName(user: User) {
12 return user.name; // Fehler wird bereits während der Entwicklung erkannt
Arbeiten mit APIs
Die statische Typisierung von TypeScript erleichtert das Arbeiten mit APIs erheblich. Der klare Überblick über erwartete Datentypen macht die Integration nahtloser und minimiert potenzielle Fehlerquellen.
Beispiel mit Fetch API:
1// JavaScript
2fetch('https://api.example.com/user/1')
3 .then(response => response.json())
4 .then(data => console.log(data.name)); // Potenzielles Problem: 'name' ist nicht immer vorhanden
5
6// TypeScript
7interface ApiResponse {
8 name: string;
9}
10
11fetch('https://api.example.com/user/1')
12 .then(response => response.json() as Promise<ApiResponse>)
13 .then(data => console.log(data.name)); // Fehler wird bereits während der Entwicklung erkannt
1// JavaScript
2fetch('https://api.example.com/user/1')
3 .then(response => response.json())
4 .then(data => console.log(data.name)); // Potenzielles Problem: 'name' ist nicht immer vorhanden
5
6// TypeScript
7interface ApiResponse {
8 name: string;
9}
10
11fetch('https://api.example.com/user/1')
12 .then(response => response.json() as Promise<ApiResponse>)
13 .then(data => console.log(data.name)); // Fehler wird bereits während der Entwicklung erkannt
Arbeiten mit der Library Zod:
Zod erleichtert das Validieren von Datenstrukturen und sorgt dafür, dass TypeScript-Typen und die API-Spezifikation synchron bleiben. Hier ein einfaches Beispiel:
1import { z } from 'zod';
2
3const UserSchema = z.object({
4 name: z.string(),
5 age: z.number(),
6});
7
8// TypeScript-Typen werden automatisch aus dem Schema abgeleitet
9type User = z.infer<typeof UserSchema>;
10
11const userData = "User data string";
12const validatedUser = UserSchema.parse(userData); // Fehler wird zur Laufzeitzeit erkannt
1import { z } from 'zod';
2
3const UserSchema = z.object({
4 name: z.string(),
5 age: z.number(),
6});
7
8// TypeScript-Typen werden automatisch aus dem Schema abgeleitet
9type User = z.infer<typeof UserSchema>;
10
11const userData = "User data string";
12const validatedUser = UserSchema.parse(userData); // Fehler wird zur Laufzeitzeit erkannt
Arbeiten mit Libraries
Dank TypeScript profitiere ich von der integrierten Dokumentation beim Arbeiten mit Libraries. Die automatische Vervollständigung und klar definierten Schnittstellen machen die Nutzung von Bibliotheken zu einem effizienten und fehlerarmen Prozess.
Beispiel mit React:
1// JavaScript
2import { useState } from 'react';
3
4function ExampleComponent() {
5 const [count, setCount] = useState('10'); // Typfehler, da 'count' eine Zahl sein sollte
6}
7
8// TypeScript
9import { useState } from 'react';
10
11function ExampleComponent() {
12 const [count, setCount] = useState<number>(10); // Fehler wird bereits während der Entwicklung erkannt
13}
1// JavaScript
2import { useState } from 'react';
3
4function ExampleComponent() {
5 const [count, setCount] = useState('10'); // Typfehler, da 'count' eine Zahl sein sollte
6}
7
8// TypeScript
9import { useState } from 'react';
10
11function ExampleComponent() {
12 const [count, setCount] = useState<number>(10); // Fehler wird bereits während der Entwicklung erkannt
13}
Komponenten Props
TypeScript ermöglicht eine präzise Definition von Props für Komponenten, was nicht nur die Dokumentation verbessert, sondern auch die Entwicklung selbst beschleunigt. Fehlerhafte Prop-Übergaben gehören somit der Vergangenheit an.
Beispiel mit React-Komponente:
1// JavaScript
2function Greeting(props) {
3 return <div>Hello, {props.name}!</div>; // Potenzieller Fehler: 'name' könnte fehlen
4}
5
6// TypeScript
7interface GreetingProps {
8 name: string;
9}
10
11function Greeting(props: GreetingProps) {
12 return <div>Hello, {props.name}!</div>; // Fehler wird bereits während der Entwicklung erkannt
1// JavaScript
2function Greeting(props) {
3 return <div>Hello, {props.name}!</div>; // Potenzieller Fehler: 'name' könnte fehlen
4}
5
6// TypeScript
7interface GreetingProps {
8 name: string;
9}
10
11function Greeting(props: GreetingProps) {
12 return <div>Hello, {props.name}!</div>; // Fehler wird bereits während der Entwicklung erkannt