جاوااسکریپت - استفاده از عملگر زنجیرهای اختیاری برای دسترسی به ویژگی شیء
TypeScript 3.7 اکنون از عملگر optional chaining پشتیبانی میکند. بنابراین، شما میتوانید کدی مانند:
const value = a?.b?.c;
یعنی، شما میتوانید از این عملگر برای دسترسی به ویژگیهای یک شیء استفاده کنید، جایی که خود شیء ممکن است null یا undefined باشد. حالا چیزی که من میخواهم انجام دهم اساساً همان است، اما نامهای ویژگیها پویا هستند:
const value = a?[b]?.c;
با این حال، در آنجا خطای نحوی دریافت میکنم:
خطا TS1005: انتظار '':'' میرود.
من اینجا چه کار اشتباهی انجام میدهم؟ آیا این اصلاً ممکن است؟
به نظر میرسد این پیشنهاد دلالت بر این دارد که این امکانپذیر نیست (اما ممکن است من مثالهای نحو را اشتباه گرفته باشم).
پاسخ شماره ۱
هنگام دسترسی به یک ویژگی با استفاده از نماد براکت و زنجیره اختیاری، شما باید علاوه بر براکتها از نقطه نیز استفاده کنید:
const value = a?.[b]?.c;
این نحوه نگارش است که توسط پیشنهاد TC39 پذیرفته شد، زیرا در غیر این صورت برای پارسر سخت است که تشخیص دهد آیا این ? بخشی از یک عبارت سهتایی است یا بخشی از زنجیره اختیاری.
شیوهای که من به آن فکر میکنم: نماد زنجیرۀ اختیاری ? نیست، بلکه ?. است. اگر در حال استفاده از زنجیره اختیاری هستید، همیشه از هر دو کاراکتر استفاده خواهید کرد.
پاسخ شماره ۲
عملگر زنجیرهای اختیاری ?. است
در اینجا چند مثال برای مدیریت ویژگیها و توابع قابل تهی آورده شده است.
const example = {a: ["first", {b:3}, false]}
// Properties
example?.a // ["first", {b:3}, false]
example?.b // undefined
// Dynamic properties ?.[]
example?.a?.[0] // "first"
example?.a?.[1]?.a // undefined
example?.a?.[1]?.b // 3
// Functions ?.()
null?.() // undefined
validFunction?.() // result
(() => {return 1})?.() // 1
پاداش: مقادیر پیشفرض
?? (ادغام مقادیر تهی) میتواند برای تعیین یک مقدار پیشفرض در صورت undefined یا null استفاده شود.
const notNull = possiblyNull ?? defaultValue
const alsoNotNull = a?.b?.c ?? possiblyNullFallback ?? defaultValue
