Bu, ECMAScript İsteğe Bağlı Zincirleme spesifikasyonunda tanımlanmıştır, bu nedenle bunu tartıştığımızda muhtemelen isteğe bağlı zincirlemeye başvurmalıyız . Muhtemel uygulama:
const result = a?.b?.c;
Bunun uzun ve kısa kısmı, TypeScript ekibinin ECMAScript spesifikasyonunun sıkılaştırılmasını beklemesi, böylece uygulamalarının gelecekte kırılmaması olabilir. Eğer şimdi bir şey uygularlarsa, ECMAScript teknik özelliklerini yeniden tanımlarsa büyük değişikliklere ihtiyaç duyar.
Görmek İsteğe Bağlı Zincirleme Spesifikasyonu
Bir şeyin asla standart JavaScript olmayacağı durumlarda, TypeScript ekibi uygun gördükleri gibi uygulayabilir, ancak gelecekteki ECMAScript eklemeleri için, diğer birçok özellikte olduğu gibi erken erişim verseler bile anlambilimi korumak isterler.
Kısa Kesimler
Böylece tüm JavaScripts funky operatörleri, gibi tür dönüşümleri de mevcuttur ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
Manuel Çözüm
Ama soruya geri dönelim. JavaScript (ve bu nedenle TypeScript) benzer bir şey nasıl yapabileceğinizi açık bir örnek var, ancak kesinlikle gerçekten sonra özelliği olarak zarif olduğunu düşündürmüyorum.
(foo||{}).bar;
Yani eğer foobir undefinedsonucudur undefinedve eğer footanımlanmış ve adında bir özellik vardır barbir değere sahiptir, sonuç o değerdir.
JSFiddle'a bir örnek verdim .
Bu, daha uzun örnekler için oldukça kabataslak görünüyor.
var postCode = ((person||{}).address||{}).postcode;
Zincir İşlevi
Spesifikasyon hala havadayken daha kısa bir versiyon için umutsuzsanız, bazı durumlarda bu yöntemi kullanıyorum. Bu ifadeyi değerlendirir ve zincir memnun veya tanımsız boş / yukarı uçları (not edilemezse varsayılan döndürür !=biz burada önemli olan yok kullanmak istiyorum !==biz burada olumlu hokkabazlık istemek biraz gibi).
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));