Mapped Types
Mapped Types ermöglichen es, neue Typen basierend auf den Eigenschaften eines existierenden Typs zu erstellen. Sie sind essenziell, um Objektstrukturen dynamisch zu transformieren.
type Optional<T> = {[P in keyof T]?: T[P];};
Sorgfältig kuratierte Snippets — TypeScript, Python, Rust, Go und mehr. Jedes mit einer Zeile-für-Zeile-Erklärung, damit du Code so liest, wie die Leute ihn geschrieben haben.
Mapped Types ermöglichen es, neue Typen basierend auf den Eigenschaften eines existierenden Typs zu erstellen. Sie sind essenziell, um Objektstrukturen dynamisch zu transformieren.
type Optional<T> = {[P in keyof T]?: T[P];};
Intersection Types kombinieren mehrere Typen zu einem. Sie erlauben das Zusammenführen existierender Typen zu einem Typ, der alle benötigten Eigenschaften besitzt.
type Admin = { privileges: string[] };type User = { name: string };type SuperUser = Admin & User;const boss: SuperUser = {name: "Alice",privileges: ["all"]};
Discriminated Unions nutzen eine gemeinsame Literal-Eigenschaft (den Diskriminator), um TypeScript das sichere Eingrenzen von Union-Mitgliedern zu ermöglichen.
interface Circle { kind: "circle"; radius: number; }interface Square { kind: "square"; side: number; }type Shape = Circle | Square;function getArea(s: Shape) {if (s.kind === "circle") return Math.PI * s.radius ** 2;return s.side ** 2;}
Bedingte Typen wählen einen von zwei möglichen Typen basierend auf einer Bedingung aus, die als Typhierarchie-Test ausgedrückt wird.
type IsString<T> = T extends string ? "Yes" : "No";type Result = IsString<number>; // "No"
Die Verwendung von 'keyof' mit Generics stellt sicher, dass ein Funktionsparameter ein gültiger Schlüssel eines spezifischen Objekts ist, was volle Typsicherheit und IDE-Autovervollständigung bietet.
function getProperty<T, K extends keyof T>(obj: T, key: K) {return obj[key];}const user = { id: 1, name: "Bob" };const userName = getProperty(user, "name");
Abstrakte Klassen können nicht direkt instanziiert werden. Sie dienen als Vorlagen, die es ermöglichen, gemeinsame Methoden zu definieren, während Unterklassen gezwungen werden, spezifische 'abstrakte' Logik zu implementieren.
abstract class Shape {constructor(public color: string) {}abstract getArea(): number;printColor() {console.log(`Color: ${this.color}`);}}class Circle extends Shape {constructor(color: string, private radius: number) {super(color);}getArea() { return Math.PI * this.radius ** 2; }}
Template-Literal-Typen ermöglichen es, neue String-Typen durch die Kombination bestehender Union-Typen zu erstellen. Dies ist äußerst nützlich, um vorhersehbare String-Muster wie CSS-Klassen oder Aktionsnamen zu generieren.
type Direction = "left" | "right";type Speed = "fast" | "slow";type Movement = `${Direction}-${Speed}`;const action: Movement = "left-fast";// const error: Movement = "up-fast"; // Error
Index-Signaturen ermöglichen es Objekten, flexible Keys zu haben, die im Voraus nicht bekannt sind. Man definiert den Typ des Keys (meist String oder Number) und den Typ des zurückgegebenen Wertes.
interface StringConfig {[key: string]: string | number;id: string;version: number;}const config: StringConfig = {id: "A1",version: 1.2,theme: "dark",retries: 5};