⚡ AutoSnippets PRO EN

TypeScript: Produkcyjne Snippet'y Kodu

Wzorce TypeScript: dependency injection, walidacja typów, repozytoria generyczne.

Python JavaScript TypeScript Java C# C++ Go PHP Rust SQL

Na tej stronie:

11. TypeScript: Kontener DI (Generics)

TypeScript

Ręczna implementacja wzorca odwrócenia kontroli z użyciem generyków.

class Container {
    private services = new Map();

    register(name: string, instance: T): void {
        this.services.set(name, instance);
    }

    resolve(name: string): T {
        const service = this.services.get(name);
        if (!service) throw new Error(`Service not found: ${name}`);
        return service as T;
    }
}

Kiedy używać

Stosowane w większych aplikacjach, gdzie trzeba zarządzać zależnościami między wieloma serwisami bez ręcznego przekazywania ich wszędzie.

Typowe pułapki

Rejestrowanie serwisu pod złą nazwą (literówka w stringu) da błąd dopiero w runtime — rozważ typowane klucze zamiast zwykłych stringów.

12. TypeScript: Parser Zmiennych Środowiskowych

TypeScript

Walidacja konfiguracji środowiskowej z użyciem biblioteki Zod.

import { z } from 'zod';

const envSchema = z.object({
    PORT: z.string().transform(Number),
    DATABASE_URL: z.string().url(),
    NODE_ENV: z.enum(['development', 'production'])
});

export const env = envSchema.parse(process.env);

Kiedy używać

Warto stosować przy starcie każdej aplikacji, żeby wychwycić brakującą lub błędną konfigurację od razu, a nie w trakcie działania.

Typowe pułapki

Zod rzuca wyjątkiem przy pierwszym błędzie walidacji — jeśli chcesz zobaczyć wszystkie błędy naraz, użyj metody .safeParse() zamiast .parse().

13. TypeScript: Generic Repository Pattern

TypeScript

Abstrakcja operacji na bazie danych dla dowolnych modeli TypeScript.

interface IRepository {
    findById(id: string): Promise;
    save(entity: T): Promise;
}

class InMemoryRepository implements IRepository {
    private items = new Map();
    async findById(id: string): Promise { return this.items.get(id) || null; }
    async save(entity: T): Promise { this.items.set(entity.id, entity); }
}

Kiedy używać

Przydatne, gdy masz wiele podobnych modeli danych i nie chcesz pisać tego samego kodu CRUD dla każdego z osobna.

Typowe pułapki

Zbyt generyczne repozytorium bywa trudne do rozszerzenia o specyficzne zapytania — czasem lepiej dodać osobne metody dla konkretnych modeli.

14. TypeScript: Validator Struktur w Czasie Rzeczywistym

TypeScript

Głębokie sprawdzanie typów obiektów zagnieżdżonych przez Type Guards.

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

function isUser(obj: any): obj is User {
    return obj 
        && typeof obj === 'object' 
        && typeof obj.id === 'string' 
        && typeof obj.name === 'string';
}

Kiedy używać

Przydatne przy walidacji danych przychodzących z zewnątrz (API, plik JSON), gdzie TypeScript sam w sobie nie sprawdza typów w runtime.

Typowe pułapki

Type guard sprawdza tylko strukturę na pierwszym poziomie — zagnieżdżone obiekty wymagają dodatkowych sprawdzeń albo biblioteki jak Zod.

15. TypeScript: Silnie Typowany Logger

TypeScript

System rejestrowania zdarzeń produkcyjnych z interfejsami poziomu logów.

type LogLevel = 'INFO' | 'WARN' | 'ERROR';

class TypedLogger {
    private log(level: LogLevel, message: string, meta?: Record) {
        console.log(JSON.stringify({ timestamp: new Date().toISOString(), level, message, ...meta }));
    }
    info(msg: string, meta?: Record) { this.log('INFO', msg, meta); }
    error(msg: string, meta?: Record) { this.log('ERROR', msg, meta); }
}

Kiedy używać

Ułatwia analizę logów produkcyjnych, bo każdy wpis ma spójną strukturę JSON, którą łatwo przeszukać w narzędziach jak Datadog czy ELK.

Typowe pułapki

Logowanie bezpośrednio do konsoli w produkcji bywa niewystarczające — warto docelowo podpiąć to pod właściwy transport (plik, zewnętrzny serwis).