This commit is contained in:
23
04_typescript/uebungen/04_without-any/index.html
Normal file
23
04_typescript/uebungen/04_without-any/index.html
Normal file
@@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 4: Vermeiden von any Parametern in Funktionen</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h1>Übung 4: Vermeiden von any Parametern in Funktionen</h1>
|
||||
<p>
|
||||
Refaktoriere eine Funktion, die den Type any für ihre Parameter verwendet. Ersetze any durch spezifischere
|
||||
Typen, um die Type-Safety zu verbessern.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/04_without-any/package.json
Normal file
13
04_typescript/uebungen/04_without-any/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "04_without-any",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
6
04_typescript/uebungen/04_without-any/src/main.ts
Normal file
6
04_typescript/uebungen/04_without-any/src/main.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
const processData = (input: any): any => {
|
||||
return input * 2;
|
||||
};
|
||||
|
||||
let result = processData('100');
|
||||
console.log(result);
|
||||
47
04_typescript/uebungen/05_type-annotations/index.html
Normal file
47
04_typescript/uebungen/05_type-annotations/index.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 5: Type Annotations in TypeScript-Funktionen</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h1>Übung 5: Type Annotations in TypeScript-Funktionen</h1>
|
||||
<p>
|
||||
In dieser Übung übst du das Hinzufügen von Type Annotations zu Variablen und Funktionen in TypeScript. Das
|
||||
hilft dir dabei, zu verstehen, wie TypeScript Typen herleitet und wann es sinnvoll ist, sie explizit zu
|
||||
deklarieren.
|
||||
</p>
|
||||
<p>
|
||||
Deine Aufgabe ist es, ein einfaches TypeScript-Programm zu erstellen, das die folgenden Schritte ausführt:
|
||||
</p>
|
||||
<ol class="list">
|
||||
<li>
|
||||
<strong>Deklariere eine Variable</strong>, um den Namen einer Person zu speichern, und gib ihn explizit
|
||||
als String ein.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Deklariere eine Funktion</strong>, die zwei Parameter, <code>firstName</code> und
|
||||
<code>lastName</code>, beide vom Typ String, benötigt und einen verketteten vollständigen Namen (ebenfalls
|
||||
vom Typ String) zurückgibt.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Deklariere eine weitere Funktion</strong>, die die Summe des Zahlenfeldes
|
||||
<code>[10, 20, 30]</code> berechnet. Diese Funktion sollte das Zahlenfeld als Eingabe haben und die Summe
|
||||
der Zahlen zurückgeben (der Rückgabetyp sollte Zahl sein).
|
||||
</li>
|
||||
<li>
|
||||
Verwende die Funktionen und Variablen, um eine Nachricht zu protokollieren, die den vollständigen Namen
|
||||
einer Person und die Summe einer Reihe von Zahlen enthält.
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/05_type-annotations/package.json
Normal file
13
04_typescript/uebungen/05_type-annotations/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "05_type-annotations",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
7
04_typescript/uebungen/05_type-annotations/src/main.ts
Normal file
7
04_typescript/uebungen/05_type-annotations/src/main.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
// TODO: Deklariere eine Variable, um den Namen einer Person zu speichern, und gib ihn explizit als String ein.
|
||||
|
||||
// TODO: Deklariere eine Funktion, die zwei Parameter, firstName und lastName, beide vom Typ String, benötigt und einen verketteten vollständigen Namen (ebenfalls vom Typ String) zurückgibt.
|
||||
|
||||
// TODO: Deklariere eine weitere Funktion, die die Summe des Zahlenfeldes [10, 20, 30] berechnet. Diese Funktion sollte das Zahlenfeld als Eingabe haben und die Summe der Zahlen zurückgeben (der Rückgabetyp sollte Zahl sein).
|
||||
|
||||
// TODO: Verwende die Funktionen und Variablen, um eine Nachricht zu protokollieren, die den vollständigen Namen einer Person und die Summe einer Reihe von Zahlen enthält.
|
||||
58
04_typescript/uebungen/06_optional-properties/index.html
Normal file
58
04_typescript/uebungen/06_optional-properties/index.html
Normal file
@@ -0,0 +1,58 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 6: Definieren und Verwenden von Objekttypen mit optionalen Eigenschaften</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h2>Übung 6: Definieren und Verwenden von Objekttypen mit optionalen Eigenschaften</h2>
|
||||
<p>
|
||||
In dieser Übung übst du, Object Types mit erforderlichen und optionalen Eigenschaften in TypeScript zu
|
||||
definieren. Du erstellst eine Funktion, die mit einem Objekt arbeitet, das ein Buch darstellt. Das Objekt
|
||||
sollte Eigenschaften für den Titel (ein String), den Autor (ein String) und ein optionales Erscheinungsjahr
|
||||
(eine Zahl) enthalten. Dann implementierst du eine Logik, um sicher auf diese Eigenschaften zuzugreifen und
|
||||
sie zu verwenden, einschließlich der optionalen Eigenschaft.
|
||||
</p>
|
||||
<ol class="list">
|
||||
<li>
|
||||
Definiere einen Objekttyp Book mit den folgenden Eigenschaften:
|
||||
<ul>
|
||||
<li><code>title</code>: Eine Zeichenkette, die den Titel des Buches angibt.</li>
|
||||
<li><code>author</code>: Eine Zeichenkette, die den Autor des Buches angibt.</li>
|
||||
<li>
|
||||
<code>yearPublished</code>: Eine optionale Zahl, die das Jahr angibt, in dem das Buch veröffentlicht
|
||||
wurde.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
Implementiere eine Funktion <code>printBookDetails</code>, die einen Parameter vom Typ
|
||||
<code>Book</code> annimmt und die Details des Buches ausgibt.
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Wenn die <code>yearPublished</code> bereitgestellt wird, drucke sie zusammen mit der title und author
|
||||
aus.
|
||||
</li>
|
||||
<li>
|
||||
Wenn <code>yearPublished</code> nicht angegeben wird, wird eine Meldung gedruckt, die besagt, dass das
|
||||
Erscheinungsjahr unbekannt ist.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
Teste die Funktion mit verschiedenen Objekten, die entweder die Eigenschaft
|
||||
<code>yearPublished</code> enthalten oder nicht.
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/06_optional-properties/package.json
Normal file
13
04_typescript/uebungen/06_optional-properties/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "06_optional-properties",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
// Step 1: Define the Book object type
|
||||
|
||||
// Step 2: Implement the function to print book details
|
||||
|
||||
// Test cases to verify your code implementation (comment out the code below to remove the initial errors)
|
||||
printBookDetails({ title: 'The TypeScript Handbook', author: 'Dan Vanderkam' });
|
||||
printBookDetails({ title: 'Clean Code', author: 'Robert C. Martin', yearPublished: 2008 });
|
||||
24
04_typescript/uebungen/07_union-types/index.html
Normal file
24
04_typescript/uebungen/07_union-types/index.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 7: Umgang mit Union Types in TypeScript</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h2>Übung 7: Umgang mit Union Types in TypeScript</h2>
|
||||
<p>
|
||||
In dieser Übung übst du den Umgang mit Union Types in TypeScript, indem du eine Funktion erstellst, die
|
||||
mehrere Typen annimmt und jeden Typ entsprechend behandelt. Du verwendest Techniken fürs Type Narrowing, um
|
||||
sicherzustellen, dass sich die Funktion je nach Art der Eingabe richtig verhält.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/07_union-types/package.json
Normal file
13
04_typescript/uebungen/07_union-types/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "07_union-types",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
17
04_typescript/uebungen/07_union-types/src/main.ts
Normal file
17
04_typescript/uebungen/07_union-types/src/main.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
const processInput = (input: string | number | boolean): string | number => {
|
||||
// TODO: Implement logic here to handle different types of input
|
||||
// - If the input is a string, return the string in uppercase
|
||||
// - If the input is a number, return the square of the number
|
||||
// - If the input is a boolean, return "Yes" if true, otherwise "No"
|
||||
|
||||
// Placeholder return statement to be replaced
|
||||
return input;
|
||||
};
|
||||
|
||||
// Test cases to verify your code implementation (comment out the code below to remove the initial errors)
|
||||
console.log(processInput('example')); // => "EXAMPLE"
|
||||
console.log(processInput(7)); // => 49
|
||||
console.log(processInput(true)); // => "Yes"
|
||||
console.log(processInput(false)); // => "No"
|
||||
}
|
||||
24
04_typescript/uebungen/08_type-aliase/index.html
Normal file
24
04_typescript/uebungen/08_type-aliase/index.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 8: Type Aliase in TypeScript verwenden</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h2>Übung 8: Type Aliase in TypeScript verwenden</h2>
|
||||
<p>
|
||||
In dieser Übung übst du das Erstellen und Verwenden von Type Aliasen, um deinen TypeScript-Code zu
|
||||
vereinfachen und klarer zu gestalten. Du definierst Type Aliase für einen Objekt- und einen Union Type und
|
||||
verwendest diese Aliase dann in Funktionen, um deinen Code lesbarer und wartbarer zu machen.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/08_type-aliase/package.json
Normal file
13
04_typescript/uebungen/08_type-aliase/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "08_type-aliase",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
26
04_typescript/uebungen/08_type-aliase/src/main.ts
Normal file
26
04_typescript/uebungen/08_type-aliase/src/main.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
// Step 1: Define a type alias 'Person' for an object type with the following properties:
|
||||
// - name: a string
|
||||
// - age: a number
|
||||
// - isActive: a boolean
|
||||
|
||||
// Step 2: Define a type alias 'ResponseStatus' for a union type that includes the following string literals:
|
||||
// - "success"
|
||||
// - "failure"
|
||||
// - "pending"
|
||||
|
||||
// Step 3: Implement a function 'printPersonDetails' that takes a parameter of type 'Person'
|
||||
// - The function should print out the person's name, age, and activity status ("Active" or "Inactive" based on the isActive property).
|
||||
|
||||
// Step 4: Implement a function 'handleResponse' that takes a parameter of type 'ResponseStatus'
|
||||
// - The function should print different messages based on the value of the 'ResponseStatus' ("Operation successful", "Operation failed", "Operation pending").
|
||||
|
||||
// Test cases to verify your code implementation (comment out the code below to remove the initial errors)
|
||||
|
||||
// Create an object of type 'Person' and pass it to 'printPersonDetails'
|
||||
const person = { name: 'Alice', age: 30, isActive: true };
|
||||
printPersonDetails(person); // => Name: Alice, Age: 30, Status: Active
|
||||
|
||||
// Pass different 'ResponseStatus' values to 'handleResponse'
|
||||
handleResponse('success'); // => "Operation successful"
|
||||
handleResponse('failure'); // => "Operation failed"
|
||||
handleResponse('pending'); // => "Operation pending"
|
||||
25
04_typescript/uebungen/09_interfaces/index.html
Normal file
25
04_typescript/uebungen/09_interfaces/index.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 9: Implementieren und Erweitern von Interfaces in TypeScript</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h2>Übung 9: Implementieren und Erweitern von Interfaces in TypeScript</h2>
|
||||
<p>
|
||||
In dieser Übung übst du das Erstellen und Verwenden von Interfaces in TypeScript. Du definierst Interfaces,
|
||||
um die Struktur von Objekten zu beschreiben, und erweiterst diese Interfaces dann, um zusätzliche
|
||||
Eigenschaften hinzuzufügen. Außerdem lernst du das Konzept der declaration merging kennen, indem du neue
|
||||
Felder zu einem bestehenden Interface hinzufügst.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/09_interfaces/package.json
Normal file
13
04_typescript/uebungen/09_interfaces/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "09_interfaces",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
27
04_typescript/uebungen/09_interfaces/src/main.ts
Normal file
27
04_typescript/uebungen/09_interfaces/src/main.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
// Step 1: Define an interface 'Person' with the following properties:
|
||||
// - name: a string
|
||||
// - age: a number
|
||||
|
||||
// Step 2: Extend the 'Person' interface to create an 'Employee' interface with an additional property:
|
||||
// - employeeId: a number
|
||||
|
||||
// Step 3: Implement a function 'printEmployeeDetails' that takes a parameter of type 'Employee'
|
||||
// - The function should print out the employee's name, age, and employeeId.
|
||||
|
||||
// Step 4: Declare the 'Display' interface with a property:
|
||||
// - resolution: a string
|
||||
|
||||
// Step 5: Add a new property 'size: number' to the 'Display' interface using declaration merging
|
||||
|
||||
// Step 6: Implement a function 'printDisplayDetails' that takes a parameter of type 'Display'
|
||||
// - The function should print out the display's resolution and size.
|
||||
|
||||
// Test cases to verify your code implementation (comment out the code below to remove the initial errors)
|
||||
|
||||
// Create an 'Employee' object and pass it to 'printEmployeeDetails'
|
||||
const employee = { name: 'Bob', age: 40, employeeId: 12345 };
|
||||
printEmployeeDetails(employee); // => Name: Bob, Age: 40, Employee ID: 12345
|
||||
|
||||
// Create a 'Display' object and pass it to 'printDisplayDetails'
|
||||
const display = { resolution: '4K', size: 27 };
|
||||
printDisplayDetails(display); // => Resolution: 4K, Size: 27
|
||||
48
04_typescript/uebungen/10_assertions/index.html
Normal file
48
04_typescript/uebungen/10_assertions/index.html
Normal file
@@ -0,0 +1,48 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Übung 10: Type Assertions in TypeScript anwenden</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<div class="alert alert-primary">
|
||||
<h2>Übung 10: Type Assertions in TypeScript anwenden</h2>
|
||||
<p>
|
||||
In dieser Übung verwendest du Type Assertions, um mit unbekannten Typen zu arbeiten und ein Objekt in einen
|
||||
benutzerdefinierten Typ zu casten.
|
||||
</p>
|
||||
<h4>Anweisungen</h4>
|
||||
<ul class="list">
|
||||
<li>Erstelle ein Objekt mysteryObject mit einer Eigenschaft info, die eine Zeichenkette enthält.</li>
|
||||
|
||||
<li>Das Objekt sollte vom Typ unknown sein.</li>
|
||||
|
||||
<li>Verwende eine Type Assertion, um zu behaupten, dass mysteryObject vom Typ { info: string } ist.</li>
|
||||
|
||||
<li>
|
||||
Greife auf die Info-Eigenschaft von mysteryObject zu und ändere ihren Wert in eine neue Zeichenkette.
|
||||
</li>
|
||||
<li>Definiere einen eigenen Typ ComplexObject mit einer Methode compute, die einen String zurückgibt.</li>
|
||||
|
||||
<li>
|
||||
Erstelle ein Objekt basicObject mit einer Methode compute.
|
||||
<ul>
|
||||
<li>Die Methode sollte die Zeichenfolge "Basic Computation" zurückgeben.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
Verwende eine zweistufige Type Assertion, um zu behaupten, dass basicObject vom Typ ComplexObject ist.
|
||||
</li>
|
||||
|
||||
<li>Rufe die Berechnungsmethode auf basicObject auf und protokolliere das Ergebnis.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/10_assertions/package.json
Normal file
13
04_typescript/uebungen/10_assertions/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "10_assertions",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
34
04_typescript/uebungen/10_assertions/src/main.ts
Normal file
34
04_typescript/uebungen/10_assertions/src/main.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
// [ ] Step 1: Create an object 'mysteryObject' with a property 'info' that holds a string.
|
||||
// - The object should be of type 'unknown'.
|
||||
|
||||
// [ ] Step 2: Use a type assertion to assert that 'mysteryObject' is of type '{ info: string }'.
|
||||
|
||||
// [ ] Step 3: Access the 'info' property and assign a new string to it.
|
||||
|
||||
// [ ] Step 4: Define a custom type 'ComplexObject' with a method 'compute' that returns a string.
|
||||
|
||||
// [ ] Step 5: Create an object 'basicObject' with a method 'compute'.
|
||||
// - The method should return a string "Basic Computation".
|
||||
|
||||
// [ ] Step 6: Use a two-step type assertion to assert that 'basicObject' is of type 'ComplexObject'.
|
||||
|
||||
// [ ] Step 7: Call the 'compute' method on 'basicObject' and log the result.
|
||||
|
||||
// Test cases to verify your code implementation (comment out the code below to remove the initial errors)
|
||||
|
||||
// Verify that 'info' was correctly accessed and modified
|
||||
console.log('Updated info:', typedMysteryObject.info); // => "Updated Info"
|
||||
|
||||
// Verify that 'compute' method of 'complexObject' returns the expected result
|
||||
if (complexObject.compute() === 'Basic Computation') {
|
||||
console.log('compute method returned the expected result.');
|
||||
} else {
|
||||
console.error('compute method did not return the expected result.');
|
||||
}
|
||||
|
||||
// Verify 'info' type compatibility
|
||||
if (typeof typedMysteryObject.info === 'string') {
|
||||
console.log('info property is of type string.');
|
||||
} else {
|
||||
console.error('info property is not of type string.');
|
||||
}
|
||||
11
04_typescript/uebungen/o01_create-btn/assets/js/bundle.js
Normal file
11
04_typescript/uebungen/o01_create-btn/assets/js/bundle.js
Normal file
@@ -0,0 +1,11 @@
|
||||
(() => {
|
||||
// src/main.ts
|
||||
(() => {
|
||||
const DOM = {
|
||||
output: document.querySelector(".output")
|
||||
};
|
||||
const init = () => {
|
||||
};
|
||||
init();
|
||||
})();
|
||||
})();
|
||||
20
04_typescript/uebungen/o01_create-btn/index.html
Normal file
20
04_typescript/uebungen/o01_create-btn/index.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>CreateBtn als Modul</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="assets/js/bundle.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="container py-5">
|
||||
<h1>CreateBtn als Modul</h1>
|
||||
<div class="output alert alert-secondary my-3">
|
||||
Hier sollen 4 verschiedene Buttons erstellt über das <strong>CreateBtn</strong> Modul hinzugefügt werden.
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
13
04_typescript/uebungen/o01_create-btn/package.json
Normal file
13
04_typescript/uebungen/o01_create-btn/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "create-btn",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "module"
|
||||
}
|
||||
31
04_typescript/uebungen/o01_create-btn/src/CreateBtn.ts
Normal file
31
04_typescript/uebungen/o01_create-btn/src/CreateBtn.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
interface Options {}
|
||||
|
||||
const CreateButton = (options = {}) => {
|
||||
// Destructuring
|
||||
const {
|
||||
classes = [],
|
||||
iconName = 'circle',
|
||||
label = 'No Label',
|
||||
clickHandler = () => {
|
||||
console.log('no action');
|
||||
},
|
||||
} = options;
|
||||
|
||||
const btn = document.createElement('button');
|
||||
const icon = document.createElement('i');
|
||||
const span = document.createElement('span');
|
||||
|
||||
btn.classList.add('btn', 'btn-sm', ...classes);
|
||||
icon.classList.add('fas', `fa-${iconName}`);
|
||||
span.classList.add('visually-hidden');
|
||||
span.textContent = label;
|
||||
|
||||
btn.addEventListener('click', clickHandler);
|
||||
// btn.append(icon,span)
|
||||
btn.appendChild(icon);
|
||||
btn.appendChild(span);
|
||||
|
||||
return btn;
|
||||
};
|
||||
|
||||
export default CreateButton;
|
||||
19
04_typescript/uebungen/o01_create-btn/src/main.ts
Normal file
19
04_typescript/uebungen/o01_create-btn/src/main.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import CreateBtn from './CreateBtn.ts';
|
||||
|
||||
(() => {
|
||||
// === DOM & VARS =======
|
||||
const DOM = {
|
||||
output: document.querySelector('.output') as HTMLDivElement,
|
||||
};
|
||||
|
||||
// === INIT =============
|
||||
const init = () => {};
|
||||
|
||||
// === EVENTHANDLER =====
|
||||
|
||||
// === XHR/FETCH ========
|
||||
|
||||
// === FUNCTIONS ========
|
||||
|
||||
init();
|
||||
})();
|
||||
BIN
04_typescript/uebungen/uebungen-04-10-o1.zip
Normal file
BIN
04_typescript/uebungen/uebungen-04-10-o1.zip
Normal file
Binary file not shown.
@@ -1,2 +1,23 @@
|
||||
(() => {
|
||||
// src/03_object-types.ts
|
||||
{
|
||||
const calculateArea = (rect) => {
|
||||
console.log("The area of the rectangle is " + rect.width * rect.height);
|
||||
};
|
||||
calculateArea({ width: 5, height: 10 });
|
||||
const calculateArea2 = ({ width, height } = { width: 10, height: 10 }) => {
|
||||
console.log("The area of the rectangle is " + width * height);
|
||||
};
|
||||
calculateArea2({ width: 5, height: 10 });
|
||||
const printPersonInfo = (person) => {
|
||||
console.log("Name: " + person.name);
|
||||
if (person.age !== void 0) {
|
||||
console.log("Age: " + person.age.toString());
|
||||
} else {
|
||||
console.log("Age is not provided");
|
||||
}
|
||||
};
|
||||
printPersonInfo({ name: "John" });
|
||||
printPersonInfo({ name: "Jane", age: 25 });
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
(() => {
|
||||
// src/04_union-types.ts
|
||||
{
|
||||
const printStatus = (status) => {
|
||||
console.log("Status: ", status);
|
||||
};
|
||||
printStatus(true);
|
||||
printStatus("loading...");
|
||||
const greetPeople = (names) => {
|
||||
if (Array.isArray(names)) {
|
||||
console.log("Hello, " + names.join(" and "));
|
||||
} else {
|
||||
console.log("Hello, " + names);
|
||||
}
|
||||
};
|
||||
greetPeople("John");
|
||||
greetPeople(["Ersin", "Kahleel", "Andreas", "Adel"]);
|
||||
const greetNames = (...names) => {
|
||||
console.log(`Hello, ${names.join(" and ")}`);
|
||||
};
|
||||
greetNames("John");
|
||||
greetNames("Ersin", "Kahleel", "Andreas", "Adel");
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,31 @@
|
||||
(() => {
|
||||
// src/05_type-statement.ts
|
||||
{
|
||||
const printCarDetails = (car) => {
|
||||
console.log(`Car Make: ${car.make}`);
|
||||
console.log(`Car Model: ${car.model}`);
|
||||
console.log(`Car Year: ${car.year}`);
|
||||
};
|
||||
const myCar = { make: "Toyota", model: "Corolla", year: 2021 };
|
||||
printCarDetails(myCar);
|
||||
const displayStatus = (status) => {
|
||||
if (status === "success") {
|
||||
console.log("Operation was successful!");
|
||||
} else if (status === "error") {
|
||||
console.log("There was an error.");
|
||||
} else {
|
||||
console.log("Loading...");
|
||||
}
|
||||
};
|
||||
displayStatus("success");
|
||||
displayStatus("error");
|
||||
displayStatus("loading");
|
||||
const capitalize = (input) => {
|
||||
return input.charAt(0).toUpperCase() + input.slice(1);
|
||||
};
|
||||
const applyTransform = (input, transform) => {
|
||||
return transform(input);
|
||||
};
|
||||
console.log(applyTransform("hello", capitalize));
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,12 @@
|
||||
(() => {
|
||||
// src/06_type-as-statement.ts
|
||||
{
|
||||
const h1El = document.querySelector("h1");
|
||||
const headlineElement = document.querySelector("h1");
|
||||
console.log(h1El);
|
||||
headlineElement.style.color = "tomato";
|
||||
const pEl = document.querySelector("p");
|
||||
const paragraphEl = document.querySelector("p");
|
||||
console.log(pEl?.offsetHeight, paragraphEl.offsetHeight);
|
||||
}
|
||||
})();
|
||||
@@ -6,7 +6,11 @@
|
||||
<title>TypeScript - Types</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<!-- <script src="assets/js/01_grundtypen.js" defer></script> -->
|
||||
<script src="assets/js/02_fetch-example.js" defer></script>
|
||||
<!-- <script src="assets/js/02_fetch-example.js" defer></script> -->
|
||||
<!-- <script src="assets/js/03_object-types.js" defer></script> -->
|
||||
<!-- <script src="assets/js/04_union-types.js" defer></script> -->
|
||||
<!-- <script src="assets/js/05_type-statement.js" defer></script> -->
|
||||
<script src="assets/js/06_type-as-statement.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
// Object Types - bei einem Object Type kann man die Eigenschaften entweder mit einem Komma (,) oder einem Semikolon (;) trennen. Beide sind zulässig
|
||||
{
|
||||
// The parameter's type annotation is an object type
|
||||
// function calculateArea3(rect: { width: number; height: number }) {
|
||||
// console.log('The area of the rectangle is ' + rect.width * rect.height);
|
||||
// }
|
||||
|
||||
// calculateArea3({ width: 5, height: 10 });
|
||||
|
||||
type RectObj = { width: number; height: number };
|
||||
|
||||
const calculateArea = (rect: RectObj): void => {
|
||||
console.log('The area of the rectangle is ' + rect.width * rect.height);
|
||||
};
|
||||
|
||||
calculateArea({ width: 5, height: 10 });
|
||||
|
||||
// ----------------------------
|
||||
// Destructuring in der Parameterliste
|
||||
// const calculateArea2 = (DESTRUCTURING: OBJECT_TYPE = DEFAULT_OBJECT) => {}
|
||||
const calculateArea2 = ({ width, height }: { width: number; height: number } = { width: 10, height: 10 }): void => {
|
||||
console.log('The area of the rectangle is ' + width * height);
|
||||
};
|
||||
|
||||
calculateArea2({ width: 5, height: 10 });
|
||||
|
||||
// ----------------------
|
||||
|
||||
// function printPersonInfo(person: { name: string; age?: number }) {
|
||||
// console.log('Name: ' + person.name);
|
||||
// if (person.age !== undefined) {
|
||||
// console.log('Age: ' + person.age);
|
||||
// } else {
|
||||
// console.log('Age is not provided');
|
||||
// }
|
||||
// }
|
||||
|
||||
// interface PersonObj2 {
|
||||
// name: string;
|
||||
// age?: number;
|
||||
// }
|
||||
type PersonObj = {
|
||||
name: string;
|
||||
age?: number;
|
||||
};
|
||||
|
||||
const printPersonInfo = (person: PersonObj) => {
|
||||
console.log('Name: ' + person.name);
|
||||
if (person.age !== undefined) {
|
||||
console.log('Age: ' + person.age.toString());
|
||||
} else {
|
||||
console.log('Age is not provided');
|
||||
}
|
||||
};
|
||||
|
||||
// Both are OK
|
||||
printPersonInfo({ name: 'John' });
|
||||
printPersonInfo({ name: 'Jane', age: 25 });
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
// Union Type - Menge von möglichen Datentyp-Werten erlauben
|
||||
{
|
||||
// function printStatus(status: boolean | string) {
|
||||
// console.log('Status: ' + status);
|
||||
// }
|
||||
|
||||
type Status = boolean | string;
|
||||
|
||||
const printStatus = (status: Status): void => {
|
||||
console.log('Status: ', status);
|
||||
};
|
||||
|
||||
// OK
|
||||
printStatus(true);
|
||||
|
||||
// OK
|
||||
printStatus('loading...');
|
||||
|
||||
// Error
|
||||
// printStatus({ status: 'success' });
|
||||
// Argument of type '{ status: string; }' is not assignable to parameter of type 'boolean | string'.
|
||||
|
||||
// ----------------
|
||||
|
||||
// function greetPeople(names: string | string[]) {
|
||||
// if (Array.isArray(names)) {
|
||||
// // TypeScript knows 'names' is a 'string[]' here
|
||||
// console.log('Hello, ' + names.join(' and '));
|
||||
// } else {
|
||||
// // Here, 'names' is a single 'string'
|
||||
// console.log('Hello, ' + names);
|
||||
// }
|
||||
// }
|
||||
|
||||
const greetPeople = (names: string | string[]): void => {
|
||||
if (Array.isArray(names)) {
|
||||
// TypeScript knows 'names' is a 'string[]' here
|
||||
console.log('Hello, ' + names.join(' and '));
|
||||
} else {
|
||||
// Here, 'names' is a single 'string'
|
||||
console.log('Hello, ' + names);
|
||||
}
|
||||
};
|
||||
|
||||
greetPeople('John');
|
||||
greetPeople(['Ersin', 'Kahleel', 'Andreas', 'Adel']);
|
||||
|
||||
const greetNames = (...names: string[]): void => {
|
||||
console.log(`Hello, ${names.join(' and ')}`);
|
||||
};
|
||||
|
||||
greetNames('John');
|
||||
greetNames('Ersin', 'Kahleel', 'Andreas', 'Adel');
|
||||
|
||||
// example CreateBtn()
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
// type statement - eigene Datentyp-Annotationen definieren
|
||||
{
|
||||
// interface für wachsende und komplexe Datenstrukturen. Meistens (global) ausgelagert.
|
||||
|
||||
// interface Car {
|
||||
// make: string;
|
||||
// model: string;
|
||||
// year: number;
|
||||
// };
|
||||
|
||||
// type aliases innerhalb von Dokumenten für einfache, feststehende types und unions
|
||||
|
||||
type Car = {
|
||||
make: string;
|
||||
model: string;
|
||||
year: number;
|
||||
};
|
||||
|
||||
const printCarDetails = (car: Car): void => {
|
||||
console.log(`Car Make: ${car.make}`);
|
||||
console.log(`Car Model: ${car.model}`);
|
||||
console.log(`Car Year: ${car.year}`);
|
||||
};
|
||||
|
||||
const myCar = { make: 'Toyota', model: 'Corolla', year: 2021 };
|
||||
printCarDetails(myCar);
|
||||
|
||||
// ----------------
|
||||
|
||||
type Status = 'success' | 'error' | 'loading';
|
||||
|
||||
const displayStatus = (status: Status): void => {
|
||||
if (status === 'success') {
|
||||
console.log('Operation was successful!');
|
||||
} else if (status === 'error') {
|
||||
console.log('There was an error.');
|
||||
} else {
|
||||
console.log('Loading...');
|
||||
}
|
||||
};
|
||||
|
||||
displayStatus('success'); // OK
|
||||
displayStatus('error'); // OK
|
||||
displayStatus('loading'); // OK
|
||||
|
||||
// displayStatus('Loading'); // Error: Argument of type '"Loading"' is not assignable to parameter of type 'Status'.
|
||||
// displayStatus('complete'); // Error: Argument of type '"complete"' is not assignable to parameter of type 'Status'.
|
||||
|
||||
// -----------------------
|
||||
// type für Funktionsausdruck
|
||||
type StringTransform = (input: string) => string;
|
||||
|
||||
const capitalize = (input: string): string => {
|
||||
return input.charAt(0).toUpperCase() + input.slice(1);
|
||||
};
|
||||
|
||||
const applyTransform = (input: string, transform: StringTransform): string => {
|
||||
return transform(input);
|
||||
};
|
||||
|
||||
console.log(applyTransform('hello', capitalize)); // => "Hello"
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// Type Assertions verwenden - mit "as" statement festen Datentyp zuweisen
|
||||
{
|
||||
const h1El: HTMLHeadingElement | null = document.querySelector('h1');
|
||||
|
||||
// selber festgelegt
|
||||
const headlineElement = document.querySelector('h1') as HTMLHeadingElement;
|
||||
|
||||
console.log(h1El);
|
||||
|
||||
// h1El?.style?.color = 'tomato';
|
||||
headlineElement.style.color = 'tomato';
|
||||
|
||||
const pEl: HTMLParagraphElement | null = document.querySelector('p');
|
||||
|
||||
// selber festgelegt
|
||||
const paragraphEl = <HTMLParagraphElement>document.querySelector('p');
|
||||
|
||||
console.log(pEl?.offsetHeight, paragraphEl.offsetHeight);
|
||||
}
|
||||
Reference in New Issue
Block a user