Alışveriş Sepeti

Sepetiniz boş

Mimari & Mühendislik · 14 dk

TypeScript Strict Mode & Uçtan Uca Tip Güvenliği: E-Ticarette Runtime Hatalarını Sıfırlamak

Storefront ile Backend arasında tek bir tip sözleşmesi (Shared Types), ID karışıklıklarını derleme anında yakalayan Branded Types ve 'Cannot read properties of undefined' hatalarını tarihe gömen katı tip disiplinimiz.

Yazar: Stilgen Core Engineering

TypeScript Strict Mode & Uçtan Uca Tip Güvenliği: E-Ticarette Runtime Hatalarını Sıfırlamak

1. JavaScript'in Gevşek Tipleri E-Ticarette Neden Milyonluk Zarar Yazar?

Tip kontrolü olmayan veya any ile doldurulmuş bir e-ticaret kod tabanında yaşanan klasik felaket:

// Tip güvenliği olmayan korkunç JavaScript kodu
function applyDiscount(cart, couponCode) {
  // Eğer indirim oranı '0.20' string olarak gelirse:
  const total = cart.subtotal - cart.subtotal * couponCode.rate;
  // JavaScript tip zorlaması (Type Coercion) sonucunda 'NaN' veya hatalı bakiye!
}

Daha da yaygın olanı; parametre sırasının karıştırılmasıdır:

// transferStock(fromWarehouseId: string, toWarehouseId: string)
// Geliştirici yanlışlıkla parametreleri ters verir:
transferStock(targetWarehouse, sourceWarehouse); // Derleyici ses çıkarmaz, stoklar ters aktarılır!

Stilmerce ekosisteminde tsconfig.json içerisindeki tüm katı derleme bayrakları (Strict Mode) zorunlu kılınmıştır.

2. Branded Types (Nominal Typing): ID Karışıklıklarına Kesin Çözüm

TypeScript varsayılan olarak yapısal (Structural) tip sistemine sahiptir. Yani iki string değişken birbirinin yerine geçebilir. Ancak bir UserId ile OrderId veya Sku aynı şey değildir!

Stilmerce'in kullandığı Branded Types tekniği:

// types/branded.ts
export type Brand<K, T> = K & { __brand: T };

export type UserId = Brand<string, 'UserId'>;
export type OrderId = Brand<string, 'OrderId'>;
export type ProductSku = Brand<string, 'ProductSku'>;

// Artık fonksiyon imzası tam güvenlidir:
function refundOrder(orderId: OrderId, authorizedBy: UserId): Promise<void> {
  // ...
}

const uId = 'usr_123' as UserId;
const oId = 'ord_456' as OrderId;

// DERLEME HATASI VERİR! Argument of type 'UserId' is not assignable to 'OrderId'
refundOrder(uId, oId);

Sıfır İnsan Hatası

Geliştirici uykusuz veya dikkatsiz olsa bile parametreleri yanlış sırayla yazarsa kod derlenmez (Compile Error). Hata canlıya çıkmadan IDE ekranında kırmızı alt çizgiyle yakalanır.

3. Storefront ve Hub Arasında Ortak Tipler (Monorepo Shared Contract)

Backend API bir DTO alanının adını değiştirdiğinde (örneğin price -> priceCents), frontend ekibi bunu manuel güncellemeyi unutursa sayfa çöker.

Stilmerce monorepo'sunda tek bir tip kaynağı (Single Source of Truth) bulunur:

packages/
├── shared-types/     # Ortak DTO'lar, Branded tipler ve Enum'lar
├── stilmerce-api/    # NestJS Backend (Shared tipleri uygular)
└── stilmerce-front/  # Next.js Storefront (Aynı tipleri import eder)

Backend'de yapılan herhangi bir tip değişikliği, frontend'in derleme adımında anında TypeScript uyarısı verdirerek API sürüm uyuşmazlıklarını sıfıra indirir.