TypeScript, programcıyı nesne bildirimlerindeki hatalar hakkında uyararak ilave güvenlik sağlamak için Aşırı Varlık Kontrolü (Excess Property Checking) mekanizmasını uygular. Bu mekanizma, TypeScript'in yapısal tiplendirmesi gereği fazla tanımlanmamış özelliklere izin verebileceği için ortaya çıkmıştır; bu sıklıkla program mantığında hatalara yol açar, özellikle API'lerle veya formlarla çalışırken.
Aşırı Varlık Kontrolleri, nesne yapıların genelde katı bir sözleşme modeline uyduğu (örneğin, JSON'a serileştirme için) frontend geliştirme güvenliğini artırmak amacıyla tanıtılmıştır. Bir nesne, bir literel olarak oluşturulup hemen bir işlev parametresine geçirilirse veya belirli bir tipe atandıysa, TS "aşırı" bir kontrol gerçekleştirir - tanımlanmış tipe uymayan fazla özellikleri arar.
Programcı hatası, eğer nesnede hata ya da fazla bir özellik varsa gözden kaçabilir ve bu özellik yeterince kullanılamaz veya iş mantığı için görünmez kalabilir. Ayrıca, Aşırı Varlık Kontrolleri, nesne açıkça tiplenmemişse veya yayılma operatörleri veya ara değişkenler aracılığıyla işleniyorsa beklenmedik şekilde devreye girebilir.
TypeScript, Aşırı Varlık Kontrolleri'ni, doğrudan bir değişken veya işlev parametresine atanan nesne literallerine uygular. Kontrol, nesnedeki tüm özellikleri arar ve tanımlı tipe eşleştirir - eğer fazla özellik varsa, bir derleme hatası belirtilir.
interface UserProfile { name: string; age: number; } const user: UserProfile = { name: "Sam", age: 25, email: "sam@mail.com" // Hata: fazla özellik email };
Aşırı kontrolü atlamak için, örneğin dinamik özelliklere sahip nesneler veya kısmi tip kullanımı için indeks imzaları veya ara değişkenler kullanılır.
interface FlexibleUser { name: string; [prop: string]: any; // İndeks imzası yeni özelliklere izin verir } const user2: FlexibleUser = { name: "Sam", age: 25, email: "sam@mail.com" // Doğru çalışır };
Önemli özellikler:
Eğer fazla bir özelliğe sahip bir nesne oluştursanız, onu tipe sahip bir değişkene atasanız ve sonra tipini yeniden atasanız, Aşırı Varlık Kontrolleri çalışır mı?
Hayır, aşırı kontrol yalnızca bir literalin doğrudan atanmasında çalışır. Eğer nesne önceden oluşturulmuşsa ve sonra yalnızca tipi belirtilmişse, fazla özellikler tespit edilmez.
const temp = { name: "John", age: 18, foo: "bar" }; const u: UserProfile = temp; // Hata yok, foo yok sayılır
Aşırı Varlık Kontrolleri, sınıflar ve sınıf örnekleri için çalışır mı?
Hayır, bu kontrol sınıflar ve sınıf örnekleri için yapılmaz, yalnızca nesne literalleri için geçerlidir.
TS ayarlarında aşırı kontrolleri global olarak kapatmak mümkün mü?
Hayır, kapatma için ayrı bir ayar yoktur. Ancak, özellikler için bir indeks imzası belirleyebilir veya type assertion ('as') operatörü kullanarak kontrolün gereksiz olduğunu açıkça belirtebilirsiniz.
const special: UserProfile = { name: "Max", age: 22, hobby: "js" } as UserProfile;
Geliştirici, kullanıcı formu için bir arayüz oluşturur, fazladan alanlarda hata çıkmaması için tüm özelliklere [key: string]: any şeklinde izin verir.
Artılar: Dinamik verilere göre derleme hatası çıkmaz
Eksikler: Form yapısındaki herhangi bir hata veya yazım hatası tespit edilemez, hataları bulmak zorlaşır
Geliştirici katı bir arayüz tanımlar ve dinamik verileri katı bir yapıya dönüştüren ayrı bir işlev kullanır, önceden doğrulama ile.
Artılar: Arayüz her zaman beklenen sözleşme ile örtüşür, derleyici yazım hatalarını yakalar, yüksek bakım sağlanır
Eksikler: Dinamik verilerin doğrulanması ve haritalanması için ek kod yazmak gerekir