สิ่งนี้ถูกกำหนดไว้ในข้อมูลจำเพาะเกี่ยวกับการผูกมัดตัวเลือก ECMAScript ดังนั้นเราจึงควรอ้างอิงถึงการผูกมัดตัวเลือกเมื่อเราพูดถึงเรื่องนี้ การติดตั้งที่น่าจะเป็น:
const result = a?.b?.c;
ความยาวและระยะสั้นของทีมนี้คือทีม TypeScript กำลังรอข้อมูลจำเพาะของ ECMAScript ที่จะทำให้รัดกุมขึ้นดังนั้นการนำไปปฏิบัติของพวกเขาอาจไม่ทำลายในอนาคต หากพวกเขานำบางสิ่งไปใช้ในตอนนี้มันจะต้องมีการเปลี่ยนแปลงครั้งใหญ่หาก ECMAScript กำหนดข้อกำหนดใหม่
ดูข้อกำหนดการผูกมัดเสริม
ทีมงาน TypeScript สามารถใช้งานได้ตามที่เห็นสมควร แต่สำหรับการเพิ่ม ECMAScript ในอนาคตพวกเขาต้องการรักษาซีแมนทิกส์แม้ว่าจะให้การเข้าถึงก่อนหน้าเนื่องจากมีฟีเจอร์อื่นมากมาย
ทางลัด
ดังนั้นผู้ให้บริการ Funky ของ JavaScript จึงสามารถใช้งานได้รวมถึงประเภทการแปลงเช่น ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
คู่มือการแก้ปัญหา
แต่กลับไปที่คำถาม ฉันมีตัวอย่างป้านว่าคุณสามารถทำสิ่งที่คล้ายกันใน JavaScript (และดังนั้น TypeScript) แม้ว่าฉันไม่ได้แนะนำอย่างแน่นอนว่ามันเป็นความสง่างามเป็นคุณลักษณะที่คุณเป็นจริงหลังจาก
(foo||{}).bar;
ดังนั้นถ้าfoo
เป็นundefined
ผลที่ได้คือundefined
และถ้าfoo
มีการกำหนดและมีคุณสมบัติที่มีชื่อbar
ที่มีค่าผลที่ได้คือค่าที่
ฉันใส่ตัวอย่าง JSFiddle
นี่เป็นตัวอย่างที่ค่อนข้างสมบูรณ์
var postCode = ((person||{}).address||{}).postcode;
ฟังก์ชั่นโซ่
หากคุณหมดหวังกับรุ่นที่สั้นกว่าในขณะที่สเปคยังคงอยู่ในอากาศฉันใช้วิธีนี้ในบางกรณี มันประเมินค่าการแสดงออกและคืนค่าเริ่มต้นถ้าเชนไม่สามารถพอใจหรือจบลงด้วยค่า null / undefined (โปรดสังเกตว่า!=
สิ่งสำคัญที่นี่เราไม่ต้องการใช้!==
เพราะเราต้องการการเล่นปาหี่ที่ดีที่นี่)
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'));