TypeScript Liebe

Warum TypeScript mein Herz im Sturm erobert hat.

30. November 2021

3 min

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

Kontakt

Wir kennen uns und hatten schon länger keinen Kontakt mehr?

Klingt beruflich interessant und wir sollten mal gemeinsam zu Steuerbot sprechen?

Schreib' mir doch gerne 'ne E-Mail, folge mir oder vernetze dich!