Salvo

WFN Üye
Konular
1,743
Mesajlar
1,765
Çözüm
0
Ticaret Puanı
0
Üyelik
6 Ay 16 Gün
Konum
İstanbul
Web Sitesi
Yok
Alanı
Belirtmemiş
1/1
Konu sahibi
TypeScript’te “Property does not exist on type” hatasını, önce bildirilen türde gerçekten hangi alanların bulunduğunu kontrol ederek çözün. Alan yanlış yazılmışsa veya yanlış nesneden okunuyorsa kodu düzeltin; alan gerçekten geçerliyse tür tanımına ekleyin; değer farklı türlerden gelebiliyorsa özelliği kullanmadan önce türü daraltın. Böylece hatayı susturmak yerine TypeScript’e verinin gerçek şeklini anlatırsınız.

Önce hatanın gösterdiği türü bulun​


Hata genellikle kodun eriştiği alanın, o noktadaki tür tanımında bulunmadığını söyler. Örneğin nesnenin türü yalnızca name alanını içeriyorsa user.age erişimi geçerli değildir; age çalışma anında nesnede bulunsa bile derleyici bunu tür bilgisinden çıkaramaz.

Kod:
type User = {
  name: string;
};

function printAge(user: User) {
  console.log(user.age); // Hata: 'age', User türünde tanımlı değil
}

Önce hata satırındaki değişkenin türünü inceleyin. Ardından alan adının yazımını, nesnenin beklediğiniz değişken olup olmadığını ve türün verinin gerçek yapısını yansıtıp yansıtmadığını kontrol edin. Çözüm, hatanın hangi nedenle çıktığına bağlıdır:
DurumUygun çözüm
Yanlış alan adı veya yanlış nesneYazımı ya da erişilen değişkeni düzeltin.
Alan nesnede her zaman bulunuyorAlanı tür tanımına ekleyin.
Alan bazı nesnelerde bulunuyorKullanımdan önce çalışma anında kontrol edin ve türü daraltın.
Alan adı önceden bilinmiyorAnahtar türünü ve değer türünü tanımlayan indeks imzası kullanın.
Haricî tür tanımı eksik veya eskiİlgili bildirim ya da paket türlerini güncelleyin veya düzeltin.
Alan türde tanımlı olmadığı için hata alıyorsanız, hatayı aşmak amacıyla rastgele tür iddiası eklemeyin. Önce hangi çözümün gerçek veri yapısına uyduğunu belirleyin.

Alanı tür tanımına ekleyin veya isteğe bağlı yapın​


Örnekte her User nesnesinde age bulunduğu varsayılıyorsa, türü buna göre güncelleyin:

Kod:
type User = {
  name: string;
  age: number;
};

function printAge(user: User) {
  console.log(user.age);
}

Buna karşılık alan bazı kullanıcılarda yoksa zorunlu alan olarak tanımlamayın; isteğe bağlı (?) yapın. Bu durumda kod, alanın bulunmayabileceğini de ele almalıdır:

Kod:
type User = {
  name: string;
  age?: number;
};

function printAge(user: User) {
  if (user.age !== undefined) {
    console.log(user.age);
  }
}

Kontrolün ardından TypeScript, if bloğunda age değerinin sayı olduğunu bilir. Bu, alanın her kullanıcıda bulunduğu anlamına gelmez; yalnızca bu kod yolunda mevcut olduğunun kontrol edildiğini gösterir.

Birleşim türlerinde ilgili nesne biçimini kontrol edin​


Değişken birden fazla nesne türünden biri olabiliyorsa, her türde bulunmayan bir alana doğrudan erişemezsiniz. Örneğin Circle | Square türündeki bir değerde radius yalnızca çemberde vardır. Alanı kullanmadan önce nesnenin biçimini kontrol edin:

Kod:
type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };

function area(shape: Circle | Square): number {
  if (shape.kind === "circle") {
    return Math.PI * shape.radius ** 2;
  }

  return shape.side ** 2;
}

Burada kind kontrolü, ilgili dalda hangi nesne türünün bulunduğunu belirler. Benzer biçimde nesnede belirli bir anahtarın bulunup bulunmadığını "age" in value ile kontrol edebilirsiniz. Ancak bu tür kontroller, dışarıdan gelen verinin değer türünü tek başına doğrulamaz; API yanıtı gibi güvenilmeyen veriler için çalışma anında ayrıca doğrulama gerekir.

Dinamik anahtarlar ve kütüphane türleri​


Nesnenin alan adları önceden bilinmiyor, fakat değerlerinin türü biliniyorsa indeks imzası tanımlanabilir. Örneğin tüm anahtarlar metin, değerler de metin veya sayı ise:

Kod:
type Settings = {
  [key: string]: string | number;
};

const settings: Settings = { theme: "dark", retryCount: 3 };
console.log(settings["theme"]);

Bu tanım, herhangi bir anahtarın kesinlikle mevcut olduğunu garanti etmez; yalnızca anahtarla erişilen değerin alabileceği türleri belirtir. Anahtarlar aslında sabitse, geniş bir indeks imzası eklemek yerine bilinen alanları tek tek tanımlayın. Böylece yazım hataları da görünür kalır.

Hata bir kütüphane nesnesinde çıkıyorsa, kullandığınız paketin veya ortamın tür bildiriminde ilgili alanın bulunup bulunmadığını kontrol edin. Gerçek nesne türü eksik ya da eski bildirilmişse, doğru paket türlerini güncelleyin veya kendi uygulamanızdaki bildirim dosyasını gerçek API ile uyumlu biçimde düzeltin. Sırf hata kaybolsun diye tüm nesneyi any yapmak ya da tür iddiası kullanmak, derleyici kontrolünü azaltır; çalışma anında alanın gerçekten var olduğunu kanıtlamaz.

Düzeltmeden sonra derleyiciyi veya editörün TypeScript tanılamasını yeniden çalıştırın. Hata sürüyorsa, tanımladığınız türün hata satırına ulaşan değişkene gerçekten verildiğini ve o değişkenin sonraki atamalarda başka bir türe dönüşmediğini izleyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic