APIs (Application Programming Interfaces) sind das Rückgrat moderner Anwendungen. Egal, ob es sich um einfache REST-APIs, flexible GraphQL-Abfragen oder mächtige OData-Services handelt – TypeScript hilft dabei, die Interaktion mit diesen Schnittstellen effizienter, sicherer und wartbarer zu gestalten. In diesem Artikel werfen wir einen Blick darauf, wie TypeScript für die Arbeit mit REST, GraphQL und OData eingesetzt werden kann.

Grundlagen der API-Interaktion mit TypeScript

Die Interaktion mit APIs erfordert in der Regel zwei Schlüsselkomponenten:

  • Anfragen (Requests), die an die API gesendet werden

  • Antworten (Responses), die verarbeitet werden müssen

TypeScript erleichtert diesen Prozess durch Typisierung, die sowohl die Struktur der Anfragen als auch die der Antworten definiert.

Beispiel: Typisierung eines API-Responses

Angenommen, wir arbeiten mit einer API, die Nutzerdaten bereitstellt. Hier ist ein typisches Beispiel:

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

async function fetchUser(userId: number): Promise<User> {
  const response = await fetch(`https://api.example.com/users/${userId}`);

  if (!response.ok) {
    throw new Error('Failed to fetch user');
  }

  const data: User = await response.json();
  return data;
}
CloudDNA Bücher

Warum Typisierung wichtig ist

  • Fehlervermeidung: TypeScript warnt, wenn z. B.

    <span>email</span>

    statt

    <span>name</span>

    abgefragt wird.

  • Autovervollständigung: IDEs wie VS Code zeigen mögliche Eigenschaften direkt an.

TypeScript und REST-APIs

Struktur einer REST-API

REST-APIs verwenden HTTP-Methoden (GET, POST, PUT, DELETE), um Daten zu manipulieren. Eine typische Interaktion könnte so aussehen:

interface Post {
  id: number;
  title: string;
  content: string;
}

async function fetchPosts(): Promise<Post[]> {
  const response = await fetch('https://api.example.com/posts');
  const data: Post[] = await response.json();
  return data;
}

async function createPost(newPost: Omit<Post, 'id'>): Promise<Post> {
  const response = await fetch('https://api.example.com/posts', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(newPost),
  });

  const data: Post = await response.json();
  return data;
}

Best Practices

Generische Funktionen nutzen:

async function fetchApi<T>(url: string): Promise<T> {
  const response = await fetch(url);
  if (!response.ok) throw new Error('Request failed');
  return response.json();
}

const posts = await fetchApi<Post[]>('https://api.example.com/posts');

Fehlerbehandlung

try {
  const post = await fetchPost(1);
} catch (error) {
  console.error('Error fetching post:', error);
}

TypeScript und GraphQL

GraphQL ist ein Abfrage- und Manipulations-Framework für APIs, das flexible Datenabfragen ermöglicht. TypeScript passt perfekt, da GraphQL-Schemas bereits stark typisiert sind.

Beispiel: GraphQL-Query mit TypeScript

# GraphQL-Schema
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

Typen mit

<span>graphql-codegen</span>

generieren

import { gql } from '@apollo/client';

const GET_USER = gql`
  query GetUser($id: ID!) {
    user(id: $id) {
      id
      name
      email
    }
  }
`;

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

async function fetchUserGraphQL(userId: string): Promise<User> {
  const { data } = await client.query({
    query: GET_USER,
    variables: { id: userId },
  });

  return data.user;
}

TypeScript und OData

OData ist ein protokollbasierter Ansatz zur Bereitstellung von Daten in Unternehmensanwendungen wie SAP oder Microsoft. Es verwendet Metadaten, um die API-Datenstruktur zu beschreiben.

Beispiel: Abruf von Daten aus einer OData-API

import { ODataClient } from '@odata/client';

const client = new ODataClient({
  serviceRoot: 'https://example.com/odata/',
});

async function fetchODataUsers(): Promise<User[]> {
  const response = await client.get('/Users?$filter=name eq \'John\'&$orderby=id desc');
  return response.value;
}

Vorteile von OData mit TypeScript

  • Automatische Generierung von Typen aus den OData-Metadaten

  • Unterstützung für Filter, Sortierung und Paging durch einfache URL-Parameter

Best Practices für APIs mit TypeScript

Codeorganisation:

  • Modulbasierte Services erstellen (z. B.
    <span>userService.ts</span>

    ,

    <span>postService.ts</span>

    )

Automatische Typenerstellung:

  • <span>swagger-codegen</span>

    für REST

  • <span>graphql-codegen</span>

    für GraphQL

  • OData-Metadaten-Pakete für Typen aus OData-Schemas

Fehlerbehandlung:

  • Einheitliche Fehlerklassen erstellen

Fazit

TypeScript bietet eine hervorragende Grundlage, um sicher und effizient mit REST, GraphQL und OData zu arbeiten. Durch die Nutzung von Typen, automatisierten Tools und bewährten Praktiken können Entwickler robustere Anwendungen erstellen. Probieren Sie TypeScript mit einer Ihrer APIs aus – Sie werden die Vorteile schnell bemerken!