Appearance
Kapitel 10: Modularisierung und Engineering
🎯 Lernziele
In diesem Kapitel lernen Sie:
- ✅ Module exportieren (
export) - ✅ Module importieren (
import) - ✅ Typen exportieren und importieren
- ✅ Declaration Files (
.d.ts) - ✅ Typen für Drittanbieter-Bibliotheken
- ✅ TypeScript + Vite Projekt erstellen
- ✅ TypeScript + Vue/React verwenden
10.1 Exportieren (export)
📖 Einfache Definition
export macht Variablen, Funktionen, Klassen, Interfaces in anderen Dateien verfügbar.
💻 Code-Beispiel
typescript
// math.ts
// 1. Benannte Exporte (Named Exports)
export function add(a: number, b: number): number {
return a + b;
}
export function subtract(a: number, b: number): number {
return a - b;
}
export const PI: number = 3.14159;
export interface Point {
x: number;
y: number;
}
export class Calculator {
multiply(a: number, b: number): number {
return a * b;
}
}
// 2. Standard-Export (Default Export)
// Jede Datei kann höchstens einen default Export haben
export default function greet(name: string): string {
return `Hallo, ${name}!`;
}10.2 Importieren (import)
📖 Einfache Definition
import bringt exportierte Werte/Typen in die aktuelle Datei.
💻 Code-Beispiel
typescript
// main.ts
// 1. Benannte Importe (Named Imports)
import { add, subtract, PI, Point, Calculator } from './math';
console.log(add(5, 3)); // Ausgabe: 8
console.log(subtract(5, 3)); // Ausgabe: 2
console.log(PI); // Ausgabe: 3.14159
const point: Point = { x: 10, y: 20 };
const calc = new Calculator();
console.log(calc.multiply(5, 3)); // Ausgabe: 15
// 2. Standard-Import (Default Import)
import greet from './math'; // Keine geschweiften Klammern!
console.log(greet("Max")); // Ausgabe: Hallo, Max!
// 3. Alles importieren als Objekt
import * as math from './math';
console.log(math.add(5, 3)); // Ausgabe: 8
console.log(math.PI); // Ausgabe: 3.1415910.3 Typen exportieren und importieren
💻 Code-Beispiel
typescript
// types.ts
// Typen exportieren
export interface User {
id: number;
name: string;
email: string;
}
export type ID = string | number;
export enum UserRole {
Admin = "ADMIN",
User = "USER",
Guest = "GUEST"
}
// main.ts
// Typen importieren
import { User, ID, UserRole } from './types';
const user: User = {
id: 1,
name: "Max",
email: "max@example.com"
};
const id: ID = 123;
const role: UserRole = UserRole.Admin;⚠️ Wichtig
Typen müssen mit export exportiert werden, um in anderen Dateien verwendet zu werden!
10.4 Declaration Files (.d.ts)
📖 Einfache Definition
.d.ts Dateien (Declaration Files) enthalten nur Typinformationen, keinen JavaScript-Code.
💡 Warum nötig?
Wenn Sie eine JavaScript-Bibliothek verwenden, wei TypeScript nicht, welche Typen sie hat. .d.ts Dateien lösen dieses Problem.
💻 Code-Beispiel
typescript
// my-library.js (JavaScript-Bibliothek)
function greet(name) {
return `Hallo, ${name}!`;
}
module.exports = { greet };
// my-library.d.ts (Declaration File)
declare function greet(name: string): string;
export = { greet };Jetzt kann TypeScript die Bibliothek typsicher verwenden!
10.5 @types Pakete
📖 Einfache Definition
Viele beliebte JavaScript-Bibliotheken haben offizielle Typdefinitionen im @types Scope.
💻 Code-Beispiel
bash
# Typdefinitionen für Node.js installieren
npm install --save-dev @types/node
# Typdefinitionen für Express installieren
npm install --save-dev @types/express
# Typdefinitionen für Jest installieren
npm install --save-dev @types/jest🎨 Praxis-Beispiel
typescript
// Ohne @types/node
const fs = require('fs');
fs.readFile(); // TypeScript weiß nicht, welche Parameter!
// Mit @types/node
import * as fs from 'fs';
fs.readFileSync('file.txt', 'utf-8'); // ✅ Vollständige Typprüfung!10.6 Eigene Declaration Files schreiben
💻 Code-Beispiel
typescript
// my-module.js
function doSomething(options) {
// ...
}
module.exports = { doSomething };
// my-module.d.ts (im selben Verzeichnis)
declare function doSomething(options: {
name: string;
age: number;
callback: () => void;
}): void;
export = { doSomething };10.7 TypeScript + Vite Projekt erstellen
Schritt 1: Vite-Projekt erstellen
bash
# Vite-Projekt erstellen
npm create vite@latest my-ts-project -- --template vanilla-ts
# Oder React + TypeScript
npm create vite@latest my-react-ts -- --template react-ts
# Oder Vue + TypeScript
npm create vite@latest my-vue-ts -- --template vue-tsSchritt 2: Projektstruktur
my-ts-project/
├── src/
│ ├── main.ts ← TypeScript-Datei
│ ├── types.ts ← Eigene Typdefinitionen
│ └── components/ ← Komponenten
│ └── Button.ts
├── tsconfig.json ← TypeScript-Konfiguration
├── vite.config.ts ← Vite-Konfiguration
└── package.jsonSchritt 3: tsconfig.json für Vite
json
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"jsx": "preserve",
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"noEmit": true,
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx"],
"exclude": ["node_modules"]
}10.8 TypeScript + React
💻 Code-Beispiel
typescript
// src/App.tsx
import React from 'react';
// Props Interface
interface GreetProps {
name: string;
age?: number;
}
// React Komponente mit TypeScript
const Greet: React.FC<GreetProps> = ({ name, age }) => {
return (
<div>
<h1>Hallo, {name}!</h1>
{age && <p>Du bist {age} Jahre alt.</p>}
</div>
);
};
export default Greet;💻 Verwendung
typescript
// src/main.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App name="Max" age={25} />
</React.StrictMode>
);10.9 TypeScript + Vue 3
💻 Code-Beispiel
vue
<!-- src/App.vue -->
<script setup lang="ts">
import { ref, computed } from 'vue';
// Typisierte Reactive Variables
const count = ref<number>(0);
const message = ref<string>('Hallo Welt');
// Computed Property mit Typ
const doubleCount = computed<number>(() => count.value * 2);
// Funktion mit Typen
function increment(): void {
count.value++;
}
// Interface für Props
interface Props {
title: string;
count?: number;
}
// Props definieren
const props = withDefaults(defineProps<Props>(), {
count: 0
});
</script>
<template>
<h1>{{ title }}</h1>
<p>Count: {{ count }}</p>
<p>Doppelt: {{ doubleCount }}</p>
<button @click="increment">Erhöhen</button>
</template>10.10 Praxis: Modulare TypeScript-Anwendung
💻 Vollständiges Beispiel
typescript
// src/types/user.ts
export interface User {
id: number;
name: string;
email: string;
role: 'admin' | 'user' | 'guest';
}
// src/api/userApi.ts
import type { User } from '../types/user';
const API_URL = 'https://api.example.com/users';
export async function getUsers(): Promise<User[]> {
const response = await fetch(API_URL);
return response.json();
}
export async function getUserById(id: number): Promise<User> {
const response = await fetch(`${API_URL}/${id}`);
return response.json();
}
// src/main.ts
import type { User } from './types/user';
import { getUsers } from './api/userApi';
async function displayUsers(): Promise<void> {
const users: User[] = await getUsers();
users.forEach((user: User) => {
console.log(`Benutzer: ${user.name} (${user.email})`);
});
}
displayUsers();📝 Zusammenfassung
In diesem Kapitel haben Sie gelernt:
- ✅ Exportieren (
export) – Macht Werte/Typen verfügbar - ✅ Importieren (
import) – Bringt Werte/Typen in die Datei - ✅ Typen exportieren/importieren – Interfaces, Type Aliases, Enums
- ✅ Declaration Files (
.d.ts) – Typinformationen für JS-Bibliotheken - ✅
@typesPakete – Offizielle Typdefinitionen installieren - ✅ TypeScript + Vite – Moderne Projektstruktur
- ✅ TypeScript + React/Vue – Typsichere Frontend-Entwicklung
🎯 Nächstes Kapitel
Im Kapitel 11 lernen wir praktische Fallstudien (Real-world Projects)!
👉 Weiter zu Kapitel 11: Praxis-Projekte
❓ Häufig gestellte Fragen
F: Soll ich default export oder named export verwenden?
A: Es wird empfohlen, named exports zu verwenden (bessere Tree-Shaking, einfachere Refactoring).
F: Woher bekomme ich Typdefinitionen für eine JS-Bibliothek?
A:
- Suchen Sie auf https://www.typescriptlang.org/dt/search
- Installieren Sie mit
npm install --save-dev @types/<library-name> - Wenn keine existieren: Schreiben Sie eine eigene
.d.tsDatei
F: Kann ich TypeScript in einem bestehenden JS-Projekt verwenden?
A: Ja! Benennen Sie .js Dateien in .ts um und kompilieren Sie schrittweise.
🎉 Herzlichen Glückwunsch! Sie haben Kapitel 10 abgeschlossen!
