📚
Lerndokumentationen
Web
Web
  • Willkommen
  • HTML
    • Was ist HTML?
    • Elemente
    • Attribute
    • Boilerplate
  • Textelemente
  • Links
  • Dokumentenstruktur
  • Medien
  • Tabellen
  • Formulare
  • CSS
    • Was ist CSS?
    • Syntax
  • Einheiten
  • Selektoren
  • Boxmodell
  • Hintergründe und Rahmen
  • Overflow
  • Bilder
  • Formulare
  • Textelemente
  • Layout
    • Flexbox
    • Grid
  • Responsive Design
  • JavaScript
    • Was ist JavaScript?
    • Einbindung in HTML
    • Grundlagen
      • Variablen und Werte
      • Datentypen
      • Operatoren und Ausdrücke
      • Kontrollstrukturen
      • Schleifen
    • Funktionen
      • Funktionsdeklarationen vs. Funktionsausdrücke
      • Arrow Functions
      • Standardparameter und Rest-Parameter
      • First-Class und Higher-Order-Funktionen
      • Closures
      • IIFE (Immediately Invoked Function Expressions)
    • Arrays
      • Erstellen und Modifizieren
      • Iteration über Arrays
      • Sortieren
      • Nützliche Methoden
    • Objekte und Datenstrukturen
      • Erstellen und Manipulieren
      • Destructuring
      • Sets und Maps
    • Strings
      • Template Literals
      • Methoden
    • Moderne JavaScript-Features
      • Optionale Verkettung
      • Nullish Coalescing Operator
      • Spread und Rest Operator
      • Kurzschlussausdrücke
    • Scope und Kontext
      • this Keyword
      • Call, Apply und Bind
      • Hoisting und Temporal Dead Zone (TDZ)
    • Objektorientierte Programmierung
      • Prototypes
      • Constructor Functions
      • ES6 Classes
      • Die create()-Methode
    • Asynchronous JavaScript
      • AJAX
      • Promises
    • Zahlen, Daten, Internationalisierung und Timer
      • Mathematische Operationen
      • Datum und Zeit
      • Internationalisierung
      • Timer
    • Modules
    • JavaScript im Browser (DOM und Events)
      • Das DOM
      • Elemente auswählen, erstellen und manipulieren
      • Styles, Attribute und Klassen
      • Events und Event Listener
      • Event Propagation
        • Event Delegation
      • DOM Traversing
    • JavaScript Engine und Performance
      • Execution Context und Call Stack
  • TypeScript
    • Was ist TypeScript?
  • Compiler und Runtimes
  • Konfiguration
  • Types
    • Primitive Typen und Typableitung
    • Arrays und Tupel
    • Objekte
    • Top- und Bottom-Types
    • Enums
    • Utility Types
      • Records
  • Typenkombination
    • Union Types
    • Discriminated Unions
    • Intersections
  • Funktionen
  • Klassen
    • Grundlagen
    • Feldinitialisierer
    • Schreibgeschützte Felder
    • Implementieren
    • Private und Geschützte Member
    • Getter und Setter
    • Statische Member
    • Abstrakte Klassen und Member
  • Modules
    • Importieren und Exportieren
    • Ambient Types
    • Namespaces
    • Globals
  • React
    • Was ist React?
    • JSX
    • Komponenten
      • Root-Komponente
      • Styling
      • Listen
      • Conditional Rendering
      • Fragments
    • Props
      • Destructuring
      • Children
    • Interaktivität
      • Event Handling
      • State
      • Formulare
    • State Management
      • State anheben
      • Derived State
    • Komposition und Reusability
      • Komponentenstrukturierung
      • Prop Drilling
      • Komposition
Bereitgestellt von GitBook
Auf dieser Seite
  • Schnittstellen und Typ-Aliase
  • Optionale Felder
  • Schreibgeschützte Felder
  • Interfaces oder Typ-Aliase
  • Type-Only-Features
  • Interface-Only-Features
  • Interaktionen zwischen type und interface
  1. Types

Objekte

JavaScript unterstützt die Deklaration eines Objekts über die Objektliteral-Syntax. Wenn in TypeScript ein Objekt mit der Objektliteral-Syntax erstellt wird, leitet TypeScript den Typ des Objekts anhand der Eigenschaften ab.

const user = { name: "Cory" };

Beachte, dass ich keinen Typ für user deklariert habe. TypeScript schlussfolgert den Typ von user als { name: string }. Dies wird als Typinferenz bezeichnet. TypeScript leitet den Typ aus dem zugewiesenen Wert ab.


In JavaScript gibt der Verweis auf eine nicht existierende Eigenschaft eines Objekts ein undefiniertes Ergebnis zurück. In TypeScript gibt der Verweis auf eine nicht existierende Eigenschaft eines Objekts einen Fehler zurück. Das ist eine gute Sache. Es hilft, Fehler frühzeitig zu erkennen.

Dieses Verhalten hilft auch, Tippfehler zu erkennen. Wenn du einen Eigenschaftsnamen falsch schreibst, wird TypeScript dies erkennen.

Dieser Fehler tritt auf, weil toUppercase eigentlich toUpperCase sein sollte. In JavaScript können diese Arten von Tippfehlern eine Menge Zeit vergeuden.

Schnittstellen und Typ-Aliase

TypeScript unterstützt die Typisierung von Objekten mit zwei anderen Ansätzen: Schnittstellen und Typ-Aliase.

interface User {
  id: number;
  name: string;
}

const user: User = { id: 1, name: "Cory" };

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

const user: User = { id: 1, name: "Cory" };

Im Allgemeinen kannst du beides verwenden. Wir werden die Unterschiede später im Detail untersuchen.


Wenn ich vergesse, eine Eigenschaft zuzuweisen, gibt TypeScript einen Fehler zurück.

const user2: User = { id: 2 };

Wenn ich versuche, eine Eigenschaft hinzuzufügen, die nicht in der Schnittstelle oder dem Typ definiert ist, wird TypeScript fehlschlagen.

const user: User = { id: 1, name: "Cory", age: 1 };

Wenn du zusätzliche Eigenschaften zulassen willst, kannst du die Indexsignatur verwenden.

interface User {
  id: number;
  name: string;
  [key: string]: any;
}

Dies besagt, dass das Benutzerobjekt beliebige zusätzliche Eigenschaften haben kann. Dies ist nützlich, wenn du nicht alle Eigenschaften im Voraus kennst.

Optionale Felder

Wir können auch optionale Felder für Objekte definieren. Dazu verwenden wir den Modifikator ?.

type User = {
  name: string;
  age?: number;
};

const cory: User = {
  name: "Cory",
};

const alice: User = {
  name: "Alice",
  age: undefined,
};

Du kannst auch explizit sagen, dass das optionale Feld undefined sein muss.

type User = {
  name: string;
  age: number | undefined;
};

const bob: User = {
  name: "Bob",
  age: undefined,
};

Schreibgeschützte Felder

Mit dem Keyword readonly können wir bestimmte Properties unveränderlich machen.

interface Point {
  readonly x: number;
  readonly y: number;
}

const point: Point = { x: 10, y: 20 };

In diesem Beispiel sind die x- und y-Eigenschaften der Schnittstelle Point schreibgeschützt. Das bedeutet, dass du ihre Werte nicht mehr ändern kannst, nachdem sie festgelegt wurden.


Ein Objektliteral kann mit der Syntax as const als schreibgeschützt gekennzeichnet werden. Hier ist ein Beispiel:

const point = { x: 10, y: 20 } as const;

Interfaces oder Typ-Aliase

Wie wir bereits gesehen haben, kannst du in TypeScript entweder type oder interface verwenden, um benutzerdefinierte Typen zu definieren. Sie sind oft austauschbar. Oft kannst du beide verwenden. Aber es gibt einige wichtige Unterschiede, also lass uns die Unterschiede untersuchen.

Diese zwei Beispiele sind äquivalent.

type UserType = { name: string; age: number };

interface UserInterface {
  name: string;
  age: number;
}

Beide können auch eine Funktionssignatur beschreiben.

type UserFunctionType = (name: string, age: number) => void;

interface UserFunctionInterface {
  (name: string, age: number): void;
}

Type-Only-Features

Diese folgenden Features können nur mit Typ-Aliasen verwendet werden.

// 1. Type alias for primitives
type Age = number;

// 2. Union
type WindowState = "open" | "closed" | "minimized";

// 3. Tuple
type StringNumberPair = [string, number];

// 4. Type intersection
type PartialStyle = { width: number };
type Style = PartialStyle & { height: number };

// 5. Mapped types / Utility types (create new type from existing type)
interface User {
  name: string;
  age: number;
  email: string;
}

type ReadonlyUser = Readonly<User>;

const readonlyUser: ReadonlyUser = {
  name: "John",
  age: 30,
  email: "john@example.com",
};

// 6. Typed arrays
type Users = User[];

Interface-Only-Features

Dahingegen können diese beiden Features nur mit interface implementiert werden.

// 1. Extend Class
class Animal {
  name = "animal";
}

interface Bear extends Animal {
  honey: boolean;
}

const bear: Bear = {
  name: "bear",
  honey: true,
};

// 2. Declaration Merging
interface User {
  name: string;
}

interface User {
  age: number;
}

const user: User = {
  name: "Cory",
  age: 22,
};

Interaktionen zwischen type und interface

Interfaces und Typ-Aliase können jedoch auch miteinander interagieren.

// 1. Interface can extend type
type User = { name: string };

interface UserWithAge extends User {
  age: number;
}

// 2. Type can extend interface
interface User {
  name: string;
}
type UserWithAge = User & { age: number };

// 3. Both can extend a class:
type Point2 = {
  x: number;
  y: number;
};

class SomePoint2 implements Point2 {
  x = 1;
  y = 2;
}

interface Point {
  x: number;
  y: number;
}

class SomePoint implements Point {
  x = 1;
  y = 2;
}

In den meisten Fällen wird beides funktionieren. Aber wir haben gerade einige einzigartige Merkmale von beiden gesehen.

Und was ist, wenn sowohl type als auch interface funktionieren? Normalerweise spielt das keine Rolle. Aber die TypeScript-Entwickler empfehlen diese Faustregel: Bevorzuge, wenn möglich, Schnittstellen, da die TypeScript-Language-Engine manchmal weniger Arbeit für Schnittstellen leisten muss, weil sie im Hintergrund implementiert sind.

Zusammenfassend lässt sich also sagen: Bevorzuge Schnittstellen, wenn es möglich ist, aber verwende Typen, wenn du Funktionen von ihnen nutzen musst.

VorherigeArrays und TupelNächsteTop- und Bottom-Types

Zuletzt aktualisiert vor 18 Tagen