valdex - kullanımı kolay TypeScript çalışma zamanı tip doğrulama kütüphanesi
(github.com/asheswook)Merhaba.
Genel olarak TypeScript backend geliştirirken hataların en sık ortaya çıktığı noktanın, derleme zamanında yakalanmayan çalışma zamanı kısmı olduğunu biliyorsunuzdur.
Örneğin en çok DB satırını parse eden repository implementasyonunda veya harici API iletişimi bölümünde ortaya çıkar.
DB'den alınan değer beklenenden farklı olduğu için çalışma zamanında değere undefined enjekte edilmesi ya da cast işlemi sırasında dışarıdan gelen ilkel değerin doğru anlaşılamaması nedeniyle insan hatasının ortaya çıkması gibi durumlar bunlardır.
Repository'yi implemente ederken de dışarıdan gelen ilkel değerlere ilişkin tipleri interface ile üst üste yazmak gerekiyor. Belki küçük bir sorun olabilir ama rahat kullanılabilmesi için bunu yaptım.
Gerçekte harici API bölümü ve DB implementasyonu kodları çok daha sade hale geldi, çalışma zamanında oluşan hatalar da azaldı.
Ekipte backend'de kullanmayı denedikten sonra iyi göründüğü için npm'e yayımladım.
import { validate } from 'valdex';
const data: unknown = await fetchData();
validate(data, {
name: String,
age: Number,
active: Boolean
});
// TypeScript now knows the exact type of data
data.name // string
data.age // number
data.active // boolean
Yukarıdaki örnek, dışarıdan veri getirilen bir durumu varsayıyor. axios kullansanız da, mysql2 kullansanız da, postgres pg kullansanız da uygulanabilir. unknown tipiyle gelen değerin doğrulaması yapılır ve doğruysa sonraki kontrol akışında bu değer validate() içinde tanımlanan değer olarak assert edilir.
Elbette zod gibi bir kütüphane de kullanılabilir.
zod ile valdex arasındaki fark, valdex'in şemayı instance olarak oluşturup kullanmaması; bunun yerine verinin alındığı yerde veri tiplerini deklaratif olarak ele alabilmesidir. Interface'i düzenlemek, DTO sınıfını değiştirmek için yukarı aşağı gidip gelerek kodu düzenlemeniz gerekmez.
npm i valdex
npm üzerinden kurup kullanabilirsiniz.
2 yorum
Basit tiplerle sınırlı olduğunda, muhtemelen oldukça iyi bir DX sunar, vay be
Nested Object ve Array’nin ikisini de desteklediği için, şu ana kadar harici API ya da repository implementasyonu sırasında gözüme takılan bir nokta olmadı.
İlginiz için teşekkür ederim!