Übersicht: TypeScript

TypeScript erweitert JavaScript um ein statisches Typsystem, das Fehler frühzeitig zur Compile-Zeit (d.h. vor build oder runtime) erkennt. Es verbessert Wartbarkeit und Skalierbarkeit von Code durch klare Typdefinitionen und bessere Tool-Unterstützung. Es kompiliert zu sauberem JavaScript (d.h. im build-Code nicht mehr vorhanden) und ist vollständig kompatibel mit bestehenden JavaScript-Projekten.

Vorteile:

  • Frühzeitige Fehlererkennung: Bugs werden im Editor/Build erkannt, bevor sie in Produktion laufen.
  • Bessere Lesbarkeit & Dokumentation: Typen dienen als „lebendige Dokumentation“.
  • Autovervollständigung & Refactoring: IntelliSense unterstützt Typen, Methoden und sichere Umbenennungen.
  • Robuster Code: Funktionen und Objekte müssen dem definierten Typvertrag entsprechen.
  • Schrittweise Einführung möglich: .js.ts, Typen können nach und nach ergänzt werden.

Tipps für den täglichen Gebrauch:

  • Verwende Generics und Utility Types für wiederverwendbare, flexible Funktionen und Datenmodelle.
  • Bevorzuge Interfaces für reine Verträge, abstract classes für gemeinsame Logik.
  • Nutze Type Narrowing und unknown für sichere Laufzeit-Checks.
  • Readonly, private/protected, Optional/Default Parameters erhöhen Code-Sicherheit.
  • Enums und Type Assertions verhindern Tippfehler und erhöhen Autocomplete-Sicherheit.

1. Variablen

KonzeptSyntax / BeispielBeschreibung
Explizite Typannotation


let name: string = 'Ada';
let age: number = 28;
let isActive: boolean = true;
Typ wird bei Zuweisung festgelegt,
später nicht änderbar
Type Inference

let city = 'London'; // string
let score = 42; // number
Typen werden automatisch erkannt,
später ebenfalls nicht änderbar
any vermeiden



let data;

data = 'hello';
data = 42;
Variablen ohne Typzuweisung
erhalten any

2. Funktionen

KonzeptSyntax / BeispielBeschreibung
Parametertypenfunction addNumbers(a: number, b: number)Parameter müssen den angegebenen
Typen erfüllen
Rückgabetypen


function greet(): string {
return 'Hello'
}
Explizit setzen hilft bei Dokumentation
und Bug-Erkennung
void


function logDate(): void {
console.log("Today")
}
Signalisiert, dass die Funktion
nichts zurückgibt
Typisierung von
Parametern und
Rückgabewert


function addNumbers(a:number, b: number):number {
return (a + b)
}

addNumbers("1","2") // ❌ Fehler, weil strings übergeben

Falsche Typen werden bereits zur
Entwicklungszeit erkannt
Vollständige Rückgaben




function isOldEnough(age: number): string {
if(age>=18) {
return 'ok'
} else {
return 'too young'
}
Alle Code-Pfade müssen dem
Rückgabetyp entsprechen

3. Arrays und Tuples

KonzeptSyntax / BeispielHinweise
Arrays – einfache Typenconst scores: number[] = [95, 87, 100];
const names: string[] = ['Ada', 'Grace'];
Alle Elemente müssen dem angegebenen Typ entsprechen
Arrays – generischconst flags: Array<boolean> = [true, false];Alternative Schreibweise für Arrays
Typensicherheitcities.push(42); // ErrorTypabweichungen werden früh erkannt
Tuples – feste Länge & Typenconst user: [string, number] = ['Ada', 36];Reihenfolge und Typ der Elemente sind strikt
Zugriff auf Elementeconst coordinates: [number, number] = [51.5, -0.12];
console.log(coordinates[0])
Zugriff auf nicht existierende Indizes ist ein Fehler
AnwendungsfallKoordinaten, Paare, Key-Value-EntriesPositionsbasierte Typprüfung

4. Objekte & Typen

KonzeptSyntax / BeispielHinweise
Objekt-Typannotationconst user: { name: string; age: number } = { name: 'Ada', age: 36 };Alle Properties müssen vorhanden sein
Optionale Propertiesconst product: { name: string; description?: string } = { name: 'Laptop' };? markiert optional
Readonlyconst settings: { readonly theme: string } = { theme: 'dark' };Verhindert Änderungen nach Zuweisung
Arrays von Objektenconst users: { name: string; age: number }[] = [{ name:'Ada', age:36 }];Typprüfung für jedes Array-Element
Zugriff sicherOptional Chaining: product.description?.toUpperCase()
Nullish Coalescing: product.description ?? 'No description'
Vermeidet Laufzeitfehler bei optionalen Properties

5. Type Aliases, Interfaces & Funktionstypen

KonzeptSyntax / BeispielHinweise
Type Aliastype Product = { id: number; name: string; price: number };Wiederverwendbar für Objekte, Arrays, Tuples, Funktionen
Arrays von Typentype ProductList = Product[];Einheitliche Typisierung für Collections
Mapped Typestype ScoreMap = { [username: string]: number };Dynamische Schlüssel mit konsistentem Werttyp
Literal Union`type Direction = ‚left‘‚right‘
Funktionstypentype Greeter = (name: string) => string;
const greet: Greeter = name => \Hello, ${name}`;`
Signatur von Funktionen wiederverwenden
Intersection Typestype Admin = User & { role: 'admin' };Kombination von Typen, vorsichtig bei Konflikten
Tuples mit Type Aliastype Point = [number, number];
const origin: Point = [0,0];
Feste Länge + Typ pro Position
Empfehlungtype standardmäßig nutzen; interface nur für klassische Vererbung oder extendsVermeidet unbeabsichtigtes Merging, klare Struktur

6. Functions – Return Types, Optional & Default Parameters

FeatureSyntax / ExampleNotes / Best Practices
Explicit Return Typefunction getFullName(firstName: string, lastName: string): string { return ... }Klarheit & Bugprävention
Optional Parameterfunction logMessage(msg: string, userId?: number)Mit ? markiert, kann ausgelassen werden
Default Parameterfunction greetUser(name: string = 'guest')Automatisch optional, fallback wenn nicht übergeben
Combining Optional & Defaultfunction increment(x: number, step: number = 1)? nicht nötig, Parameter ist optional
Best PracticeExplizite Typen für Klarheit, besonders bei komplexen oder geteilten Funktionen

7. Type Narrowing

FeatureSyntax / ExampleNotes / Best Practices
typeof Guardif (typeof value === 'string')Erkennt Typen wie string, number, etc.
Truthinessif (str) { ... }Prüft auf undefined/null, sicherer Zugriff
Equality Narrowingif (x === y) { ... }Typen werden basierend auf Vergleich eingeschränkt
in Operatorif ('bark' in pet) { pet.bark() }Prüft Existenz eines Properties in Union-Typen
Discriminated Unionsif (pet.kind === 'dog') { pet.bark() }Literal-Property hilft TypeScript bei Typ-Entscheidung
instanceofif (val instanceof Date)Prüft Klasseninstanzen
Custom Type Predicatesfunction isCar(v: Vehicle): v is CarEigene Guards für komplexe Typen
Best PracticeType Guards nutzen, um Autocomplete & Sicherheit zu verbessern

8. Enums

FeatureSyntax / ExampleNotes / Best Practices
Numeric Enumenum Direction { Up, Down, Left, Right }Default: 0,1,2,…
String Enumenum Status { Success = "SUCCESS", Failure = "FAILURE" }Besser lesbar, vermeidet Tippfehler
Usagelet move: Direction = Direction.UpSicherer als Strings/Numbers direkt
Real-WorldGame choices, RBACEnum + Switch für exhaustive Checks
Best PracticeEnums für bekannte Sets von Werten, Strings bevorzugt für Debugging

9. Type Assertions / Casting

FeatureSyntax / ExampleNotes / Best Practices
Angle Bracketslet greet1 = <string>someValueNicht in .tsx Dateien verwenden
as Syntaxlet greet2 = someValue as stringSicher in .tsx Dateien
DOM Accessconst input = document.querySelector('input') as HTMLInputElementAssertet Typ für Autocomplete & TS-Sicherheit
JSON Parsingconst posts = (await fetch(...).json()) as Post[]TS kennt Struktur nicht automatisch
Best PracticeAssertions nur, wenn Struktur sicher bekannt; verändern Typ nicht runtime

10. Null, Undefined & Unknown

FeatureSyntax / ExampleNotes / Best Practices
Allow undefined/null`let username: stringundefined; let age: number
Check before useif (name) { ... }Type Narrowing
Optional chaininguser.address?.streetSicherer Zugriff auf verschachtelte Werte
Nullish coalescinguser.address?.street ?? 'default'Fallback für undefined/null
unknown Typecatch (error: unknown)Muss vor Nutzung typengeprüft werden, sicherer als any
Best PracticeVermeide any, nutze unknown + Narrowing, ?. & ?? für Sicherheit

11. Classes, Access Modifiers & Readonly

FeatureSyntax / ExampleNotes / Best Practices
Class Declarationclass Book { title: string; author?: string }Struktur + Verhalten zusammenfassen
Optional Propertiesauthor?: stringKann weggelassen werden
Readonlyreadonly title: stringKeine Zuweisung nach Konstruktion
Private (# vs private)private balance: numberZugriff nur innerhalb der Klasse
Protectedprotected energy: numberZugriff nur für Subklassen
Best PracticeKlassen für stateful Objekte & Methoden, sonst type/interface

12. Inheritance & Abstract Classes

FeatureSyntax / ExampleNotes / Best Practices
Basic Inheritanceclass YouTuber extends ContentCreatorSubklasse erbt Eigenschaften/Methoden
Abstract Classesabstract class Notification { abstract send(): void }Zwingt Implementierung in Subklassen
Concrete vs Abstract Methodsabstract send() vs log()Teilweise gemeinsame Logik möglich
Composition AlternativeInterface + separate Klasse für VerhaltenFlexibler als unnötige Vererbung
Best PracticeVerwende extends nur bei klarer Hierarchie, sonst Composition

13. Interfaces vs Abstract Classes

FeatureInterfaceAbstract Class
Implementation✅ (concrete methods)
Constructor
Multiple Inheritance✅ via implements❌ nur single inheritance
Fields / Access Modifiers✅ protected/private
Use WhenContract/Shape definieren, mehrere inheritanceShared logic & member access control
Best PracticeStandardmäßig Interface für Typen/Contracts, Abstract Class für Basisklassen mit Logik

14. Generics

FeatureSyntax / ExampleNotes / Best Practices
Generic Functionasync function fetchData<T>(url: string): Promise<T>T fungiert als Platzhalter, Typ wird bei Aufruf festgelegt
Generic Type Aliastype ApiResponse<T> = { success: boolean; data: T }Wiederverwendbare, flexible Typdefinition
Constraining Genericsfunction getLength<T extends { length: number }>(value: T)Einschränkung auf Typen mit bestimmten Eigenschaften
Default Generic Typetype ApiResponse<T = string>Fallback-Typ, wenn kein Typ angegeben wird
Generic Function Handlingfunction handleResponse<T>(res: ApiResponse<T>)Funktion kann mit jedem T arbeiten, Type Safety bleibt erhalten
Best PracticeGenerics für wiederverwendbare, typsichere Funktionen/Typen; Constraints & Defaults nutzen für Flexibilität

15. Built-in Utility Types

Utility TypeSyntax / BeispielBeschreibung
Partial<T>






type User = {
id: number;
name: string;
email: string;
};

const draftUser: Partial<User> = { id: 12 };

=> macht alle Properties
des Typs T in der Variablen-
deklaration optional
Required<T>








type Settings = {
darkMode?: boolean;
fontSize?: number;
};

const strictSettings: Required
<Settings> = {
darkMode: true,
fontSize: 16,
};

=> macht alle Properties
des Typs T in der Variablen-
deklaration erforderlich
Readonly<T>








type Book = {
title: string;
author: string;
};

const book: Readonly<Book> = {
title: "1984",
author: "George Orwell"
};

=> macht alle Properties
des Typs T nach der Variablen-
deklaration unveränderbar
Pick<T, K>












type Contact = {
id: number;
name: string;
email: string;
phone: string;
};

type ContactInfo = Pick<Contact, "name" | "email">;

const user: ContactInfo = {
name: "Grace",
email: "grace@example.com",
};


=> erstellt neuen Typ aus
übergebenem Typ T, in dem nur
die angegeben Object-Keys K
valide sind
Omit<T, K>












type User = {
id: number;
name: string;
email: string;
age: number;
};


type UserWithoutEmailAndAge = Omit<User, "email" | "age";


const user: UserWithoutEmailAndAge = {
id: 1,
name: "Ada"
};

=> erstellt einen Sub-Typ von Typ T,
unter Ausschluss der angegebenen
Object-Keys K
Record<K, T>










type Roles = "admin" | "user" | "guest";

type RoleAccess = Record<Roles, boolean>;


const access: RoleAccess = {
admin: true,
user: true,
guest: false
};


console.log(access.admin); // true

=> erstellt ein Objekt, bei dem
die Keys vom Typ K sind und
die Values vom Typ T
Exclude<T, U>





type Event = "click" | "hover" | "scroll";

type MouseEvent = Exclude<Event, "scroll" | "hover">;


const myMouseEvent: MouseEvent = "click"; // ✅ gültig
const invalidEvent: MouseEvent = "scroll"; // ❌ Fehler

=> erstellt neuen Sub-Typ, der die
angegebenen Union-Types U aus
Typ T nicht enthält
Extract<T, U>





type Event = "click" | "hover" | "scroll";

type MouseEvent = Extract<Event, "hover">;


const myMouseEvent: MouseEvent = "hover"; // ✅ gültig
const invalidEvent: MouseEvent = "scroll"; // ❌ Fehler

=> erstellt neuen Sub-Typ, der nur
angegebene Union-Types U aus
Typ T enthält
NonNullable<T>







type Name = string | null | undefined;

type CleanName = NonNullable;


let userName: CleanName = "Ada";


userName = null; // ❌ Fehler
userName = undefined; // ❌ Fehler

=> erstellt einen Typ aus T, der
weder null noch undefined
sein darf

Links: