- Konu sahibi
- #1
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.
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
Ö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:
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.
Örnekte her
Buna karşılık alan bazı kullanıcılarda yoksa zorunlu alan olarak tanımlamayın; isteğe bağlı (
Kontrolün ardından TypeScript,
Değişken birden fazla nesne türünden biri olabiliyorsa, her türde bulunmayan bir alana doğrudan erişemezsiniz. Örneğin
Burada
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:
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
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.
Ö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:
| Durum | Uygun çözüm |
|---|---|
| Yanlış alan adı veya yanlış nesne | Yazımı ya da erişilen değişkeni düzeltin. |
| Alan nesnede her zaman bulunuyor | Alanı tür tanımına ekleyin. |
| Alan bazı nesnelerde bulunuyor | Kullanımdan önce çalışma anında kontrol edin ve türü daraltın. |
| Alan adı önceden bilinmiyor | Anahtar 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ü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.