ProgramlamaFrontend Geliştirici

TypeScript'teki Aşırı Varlık Kontrolleri (Excess Property Checks) mekanizmasından bahsedin. Nesneler için nasıl çalışır, derleme aşamasında ne kontrol edilir ve dinamik özelliklere sahip nesnelerin tiplenmesinde hangi sorunlar ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Konunun Geçmişi

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.

Problem

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.

Çözüm

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:

  • Aşırı varlık kontrolleri, yalnızca açıkça tiplenmiş bir değişkene atanan nesne literallerine uygulanır.
  • İndeks imzasıyla veya ara değişken aracılığıyla atama yaparak kontrolleri atlatmak mümkündür.
  • Basit yazım hatalarına ve veri yapı giderme hatalarına karşı koruma sağlar.

Çeldirici Sorular.

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;

Tipik hatalar ve anti-patternler

  • Kontrolü kapatmak için type assertion kullanımı (veri yapı hatalarının gözden kaçmasına neden olabilir).
  • İndeks imzasının gereksiz yere kullanımı, tip tanımının tüm kesinliğini bozabilir.

Gerçek Hayat Örneği

Olumsuz Durum

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

Olumlu Durum

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