Proje: OkulUp · Hub: OkulUp — Conventions

TypeScript Tip Pattern’leri

OpenAPI Generated Types

src/generated/api.ts — backend spec’ten üretilmiş.

import type { paths, components } from '@/generated/api';

Kullanım Pattern’leri

// Request body tipi
type LoginRequest = OpenApiRequestBody<'/api/login', 'post'>;
 
// Response tipi
type LoginResponse = OpenApiResponseBody<'/api/login', 'post', 200>;
 
// Query params
type UserFilters = OpenApiQueryParams<'/api/users', 'get'>;
 
// Component schema
type UserResource = components['schemas']['UserResource'];

RequireKeys Yardımcı Tipi

// Generated schema'dan bazı alanları zorunlu yap
type User = RequireKeys<UserResource, 'id' | 'name' | 'email'>;

API Response Tipleri

ApiResponse<T>            // { data: T; message?: string }
PaginatedResponse<T> {
  data: T[];
  links: { first, last, prev, next }
  meta: { current_page, last_page, total, per_page, from, to }
}
PaginationParams          // { page?, per_page? }
ApiError                  // { message, errors? }
ApiErrorResponse          // Axios error wrapper

Domain Tip Genişletme Pattern’i

// ❌ Direkt OpenAPI schema kullanma
type User = components['schemas']['UserResource']; // nullable alanlar sorun çıkarabilir
 
// ✅ RequireKeys ile zorunlu alanlar, sonra interface ile genişlet
type UserResource = RequireKeys<
  Omit<components['schemas']['UserResource'], 'nullable_field'>,
  'id' | 'name'
>;
export interface User extends UserResource {
  role_id: number;
  nullable_field: string | null; // manuel tip kontrolü
}

Barrel Exports

Her domain: src/types/{resource}.types.ts Tümü: src/types/index.ts’ten export ediliyor.