- Konu sahibi
- #1
Opsiyonel bir alanı kullanmadan önce değerini
Bir tür tanımında
Aşağıdaki varsayımsal örneği bir TypeScript dosyasına yazıp projenizin derleme ve çalıştırma yöntemiyle çalıştırabilirsiniz:
İlk çağrı
Alan
Bir alan nesnede bulunabilir ama değeri
İfade | Ne yapar?
alan!== undefined | Değerin undefined olmadığını kontrol eder.
"alan" in nesne | Alanı nesnede veya prototip zincirinde arar.
alan?? varsayılan | Değer null veya undefined ise varsayılanı kullanır.
| Alan null veya undefined ise erişimi durdurur.
Örneğin
Görüntülenecek bir değer üretmek istiyorsanız
İç içe opsiyonel bir alan için
undefined ile karşılaştırabilir, yalnızca alanın nesnede bulunup bulunmadığını öğrenmek için in kullanabilirsiniz. Varsayılan değer gerekiyorsa ??, iç içe alanlara güvenli erişim için ?. uygundur. Bu seçenekler aynı sonucu vermez: Önce değerin mi, yoksa alanın varlığının mı önemli olduğuna karar verin.Değeri kullanmadan önce kontrol edin
Bir tür tanımında
telefon?: string, telefon alanının bulunmayabileceğini belirtir. strictNullChecks açıkken TypeScript, alan okunurken sonucun string | undefined olabileceğini dikkate alır. Projenizin tsconfig.json dosyasında "strictNullChecks": true kullanabilir veya bu ayarı da etkinleştiren "strict": true seçeneğini açabilirsiniz.Aşağıdaki varsayımsal örneği bir TypeScript dosyasına yazıp projenizin derleme ve çalıştırma yöntemiyle çalıştırabilirsiniz:
Kod:
interface Kullanici {
ad: string;
telefon?: string;
}
function telefonGoster(kullanici: Kullanici): void {
if (kullanici.telefon !== undefined) {
console.log(kullanici.telefon.toUpperCase());
} else {
console.log("Telefon belirtilmemiş");
}
}
telefonGoster({ ad: "Ada", telefon: "abc" });
telefonGoster({ ad: "Ece" });
İlk çağrı
ABC, ikincisi Telefon belirtilmemiş yazdırır. Koşulun doğru olduğu dalda TypeScript, alanın türünü string olarak daraltır; böylece metot güvenle çağrılabilir. Alanın boş metin olması da ilk dala girer. Boş metni ayrıca reddetmek istiyorsanız bunu iş kuralınıza göre ayrıca kontrol edin.Alan
telefon?: string | null olarak tanımlanmışsa yalnız undefined kontrolü yeterli değildir. telefon != null koşulu hem null hem undefined değerlerini dışlar.Değer kontrolü ile alan varlığını ayırın
Bir alan nesnede bulunabilir ama değeri
undefined olabilir. Hangi soruyu yanıtlamak istediğinize göre yöntemi seçin:İfade | Ne yapar?
alan!== undefined | Değerin undefined olmadığını kontrol eder.
"alan" in nesne | Alanı nesnede veya prototip zincirinde arar.
alan?? varsayılan | Değer null veya undefined ise varsayılanı kullanır.
| Alan null veya undefined ise erişimi durdurur.
Örneğin
"telefon" in kullanici sonucu doğruysa anahtar bulunmuştur; bu, değerinin mutlaka kullanılabilir bir metin olduğunu kanıtlamaz. Bu ayrım özellikle eksik bir alanla açıkça undefined atanmış bir alanı farklı ele alırken önemlidir. Yalnız nesnenin kendi alanını aramak için Object.prototype.hasOwnProperty.call(kullanici, "telefon") kullanabilirsiniz.if (kullanici.telefon) gibi doğruluk kontrolü ise undefined dışında boş metni de dışlar. Sayısal ve mantıksal alanlarda da sırasıyla 0 ve false değerlerini dışlayacağı için, bu değerler geçerliyse açık değer kontrolünü tercih edin.Varsayılan değer ve iç içe alanlar
Görüntülenecek bir değer üretmek istiyorsanız
const telefon = kullanici.telefon ?? "Belirtilmemiş" kullanabilirsiniz. Alan eksikse veya değeri null ise varsayılan seçilir; boş metin korunur. Buna karşılık ||, boş metin ve 0 gibi diğer yanlış kabul edilen değerlerde de varsayılanı seçer.İç içe opsiyonel bir alan için
kullanici.profil?.sehir ifadesi, profil yoksa hata üretmeden undefined döndürür. Gerekirse sonuna ?? "Bilinmiyor" ekleyebilirsiniz. Opsiyonel zincirleme, var olan değerin beklenen türde olduğunu çalışma zamanında doğrulamaz; dışarıdan gelen veriyi kullanmadan önce ayrıca doğrulayın.Sık sorulan sorular
Opsiyonel alana açıkça undefined atanabilir mi?
Varsayılan davranışta
telefon?: string alanına undefined atanabilir. exactOptionalPropertyTypes etkinse bu atamaya izin vermek için türü telefon?: string | undefined olarak belirtmek gerekir. Bu ayar strictNullChecks gerektirir ve strict ile otomatik olarak açılmaz.Alan adından sonra! kullanmak kontrol yerine geçer mi?
Hayır.
kullanici.telefon!, TypeScript’e değerin boş olmadığını sizin varsaydığınızı bildirir; çalışma zamanında kontrol yapmaz. Değer gerçekten yoksa ardından yapılan metot çağrısı hata üretebilir. Değerin varlığından emin değilseniz açık bir koşul kullanın.