İçeriğe geç
edumintsBlog
Web & Frontend3 dk okuma

TypeScript'te Şema Kütüphanesi Kullanmadan `unknown` Değerleri Nasıl Doğrularsınız? 🛡️

Kaynak: dev.to

Paylaş
İçindekiler 4 başlık

TypeScript ile geliştirme yaparken dış dünyadan gelen verileri güvenli bir şekilde işlemek en temel mühendislik problemlerinden biridir. Bir değer şu kaynaklardan gelebilir:

  • Bir API yanıtı
  • JSON.parse çıktısı
  • Local storage (yerel depolama)
  • Bir mesaj yükü (message payload)
  • Üçüncü parti kodlar

Bu veriyi doğrulamadan önce tipi declare const input: unknown; olmalıdır. Peki bu unknown tipini her seferinde ağır bir şema kütüphanesi kullanmadan nasıl güvenli ve kullanışlı hale getirebiliriz?

🧱 unknown Görevini Yapıyor#

input.name şeklinde bir özelliğe doğrudan erişmeye çalıştığımızda TypeScript hata verir. İlk başta can sıkıcı görünse de TypeScript bize çok önemli bir şey söyler: Elimizde bir değer var ama henüz ne olduğunu bilmiyoruz.

Güvenilmeyen sınır (boundary) değerleri tam olarak bu anlama gelmelidir. Bir HTTP yanıtı veya ayrıştırılmış bir JSON, sırf uygulamamız öyle bekliyor diye otomatik olarak User tipine dönüşmez. unknown, eksik tip bilgisi değil; henüz doğrulamadığımız bir değerin dürüst tanımıdır. Asıl mesele unknown değil, güveni nasıl inşa ettiğimizdir.

😈 Kolay Kaçış Yolu: as User#

En kısa kaçış yolu tip zorlaması (type assertion) kullanmaktır:

type User = { id: string; name: string; };
declare const input: unknown;
const user = input as User;
user.name.toUpperCase();

Derleyici artık mutludur ancak çalışma zamanında (runtime) hiçbir şey kontrol edilmemiştir. Eğer name alanına 123 gibi bir sayı gelirse, user.name.toUpperCase() çağrısı çalışma zamanında patlar (💥 Runtime error). as User yalnızca derleyicinin neye inandığını değiştirir; çalışma zamanı değerini denetlemez veya eksik özellikleri eklemez. Çalışma zamanı güvenliği önemliyse, tip zorlaması bir doğrulama değildir.

🛡️ Tip Muhafızları (Type Guards) Çalışma Zamanı ile TypeScript'i Bağlar#

Ağır şema kütüphaneleri yerine is-kit gibi hafif araçlarla küçük ve birleştirilebilir tip muhafızları (type guards) oluşturabiliriz:

import { isString, oneOfValues, struct } from "is-kit";

const isUser = struct({
  id: isString,
  name: isString,
  role: oneOfValues("admin", "member"),
});

Artık unknown değeri doğrudan if (isUser(input)) kontrolünden geçirebiliriz. Bu yaklaşım aynı anda iki işi birden yapar:

  • Çalışma zamanı (Runtime) → Bu değer gerçekten beklenen yapıyla eşleşiyor mu?
  • TypeScript → Kontrol başarılı olduktan sonra bu değerin tipi nedir?

Ayrı bir şema tanımına veya as ile tip zorlamasına gerek kalmadan, küçük doğrulama fonksiyonlarını birleştirerek hem çalışma zamanı güvenliğini hem de tip çıkarımını sağlamış oluruz.

🧩 Veri Yapısı Doğal Olarak Büyüyebilir#

Gerçek dünyadaki veri yükleri genellikle daha karmaşıktır. Bir kullanıcının şu alanları olabilir:

  • İsteğe bağlı (optional) bir profili
  • Boş olabilir (nullable) bir biyografisi
  • Bir etiket (tags) listesi

Küçük tip muhafızlarını birleştirmeye devam ederek (composable yapı sayesinde), şema öncelikli ağır iş akışlarına girmeden karmaşık veri yapılarını da kolayca ve güvenle doğrulayabiliriz.

Pratik Çıkarım: Uygulamanızın dış sınırlarında (API, localStorage) as anahtar kelimesini kullanmaktan kaçının. Büyük bir doğrulama kütüphanesine ihtiyaç duymadığınız durumlarda bile basit tip muhafızları (type guards) yazarak çalışma zamanı hatalarını henüz sınırdayken yakalayın.

Kaynak ve atıf

Bu yazı, dev.to üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • dev.to/nyaomaru/how-do-you-validate-unknown-in-typescript-without-a-schema-library-1a11