Denna uppgift är en fortsättning på ts--intro och introducerar mer avancerade koncept och mönster. Dessa uppgifter är designade för att ge er djupare förståelse för hur TypeScript kan användas för att skapa robust, typsäker och skalbär kod. Rekommenderas att göras i grupp så att ni tillsammans lär er hur ni ska jobba med TypeScript i framtida projekt.
Innan du börjar med dessa uppgifter bör du ha:
- Genomfört den grundläggande TypeScript-uppgiften: ts--intro
- Förståelse för interfaces, union types, och grundläggande typer
Lära er använda generics, utility types (Partial, Pick, Omit, Required) och skapa återanvändbara typer för ett lagersystem.
Bygg ett system för att hantera produkter i en e-handelsbutik. Systemet ska vara flexibelt och typsäkert, och använda TypeScript:s avancerade typsystem för att säkerställa dataintegritet.
-
Förberedelser
- Installera NPM-paketet
typescriptsom dev dependency. - Initiera TypeScript för att skapa en
tsconfig.jsoneller skapa filen manuellt och klistra in er egna konfiguration.
- Installera NPM-paketet
-
Skapa grundläggande typer
- Skapa en
Productinterface med följande egenskaper:id, name, category, descriptionsom alla är strängar.descriptionska vara valfri (optional)pricesom är ett nummer ochinStocksom är en boolean- Samt
tagssom är en array av strängar
- Skapa en
-
Implementera en Generic Repository
-
Skapa en generic
Repository<T>class som kan hantera vilken typ av entitet som helst -
extends { id: string }innebär att parameternTmåste vara ett objekt som måste innehålla propertynidclass Repository<T extends { id: string }> { private items: T[] = []; // Implementera följande metoder/funktioner: add, findById, findAll, update, delete i denna klass }
-
Metoderna ska hantera innehållet i
items. Utforma logiken utifrån metodens namn och vad ni tror den ska åstadkomma. -
Använd generics så att alla metoder returnerar korrekta typer baserat på
T -
Nyckelordet
privatetriggar ett TS error om man direkt försöker komma åtitemsutanför klassen, exempelvis:const repository = new Repository(); repository.items; // triggar felmeddelande
-
-
Använd Utility Types
- Skapa en
CreateProductInputtyp som använderOmit<Product, 'id'> - Skapa en
UpdateProductInputtyp som använderPartial<Omit<Product, 'id'>> - Skapa en
ProductPreviewtyp som använderPick<Product, 'id' | 'name' | 'price'> - Skapa en
RequiredProducttyp som använderRequired<Product>(gördescriptionobligatorisk) - När du hovrar över namnet på varje ny typ bör du kunna se hur de skiljer sig från varandra. Reflektera över vad olika utility types har för funktionalitet.
- Skapa en
-
Skapa en child class
- Skapa en ny klass specifikt för
Productsomextendsden generiska klassen och tarProductsom parameter.
- Skapa en ny klass specifikt för
-
Implementera metoder (funktioner inuti den nya klassen) med Utility Types
createProduct(input: CreateProductInput): Product- skapar en produkt med auto-genererat ID. Exempelvis medcrypto.randomUUID().updateProduct(id: string, updates: UpdateProductInput): Product | null- uppdaterar en produktgetProductPreview(id: string): ProductPreview | null- returnerar en förhandsvisningsearchProducts(query: string, filters?: Partial<Pick<Product, 'category' | 'inStock'>>): Product[]
-
Testa ditt system
- Skapa några produkter med olika kategorier
- Testa uppdateringar med partiella data
- Verifiera att TypeScript fångar upp fel när du försöker använda felaktiga typer
- Det kommer fortfarande gå att konsollogga
itemsi.o.m attprivateinte har någon effekt vid runtime
- En fungerande
Repository<T>generic class - En fungerande
ProductRepository extends Repository<Product>child class - Flera utility types som används korrekt
- Typsäkra funktioner för CRUD-operationer
- Inga TypeScript-fel
Lägg till en findBy-metod i Repository som tar en predicate function som callback. En "predicate function" är en funktion som returnerar en boolean:
findBy(predicate: (item: T) => boolean): T[] {
// använd exempelvis .filter() här och passa in predicate som callback
}- Skapa några funktioner som använder
findByoch passar in en callback som gör en- Inkludera in-operatorn - Alltså
"key" in object, exempelvis"price" in item. Operatorn returnerar en boolean och genom att kontrollera att en property finns i ett objekt förfinas typen. Detta kallas för "type narrowing".
- Inkludera in-operatorn - Alltså