Javascript Optional Chain (object?.foo)

Javascript Optional Chain (object?.foo)

ဒီနေ့ပြောပြပေးသွားမှာက ပေါ့ပေါ့ပါးပါး နဲ့ အရမ်းအသုံးဝင်တဲ့ JavaScript ရဲ့ special syntax တစ်ခုဖြစ်တဲ့ optional chain [?.] လေးအကြောင်းပါ။

အဖြစ်များတဲ့ type error ❌

Optional chain လေးအကြောင်းမပြောခင် အောက်က code example လေးတစ်ခုကို အရင်ကြည့်ကြမယ်။

const username = user.username

အဲcodeလေးကို browser ပေါ်မှာ run လိုက်ရင် user ဆိုတဲ့ object ထဲက username လို့ခေါ်တဲ့ attribute ထဲမှာသိမ်းထားတဲ့ value တစ်ခုခုကို username ဆိုတဲ့ variable ထဲ copy ယူပြီး ထည့်ပေးသွားမယ်ပေါ့။

ပြဿနာက အခုမှစတာပါ။ user variable ထဲမှာ သိမ်းထားတာဟာ ကျွန်တော်တို့ ထင်ထားသလို object value တစ်ခုခု ဟုတ်မနေဘဲ nullish value [null (ဒါမှမဟုတ်) undefined] သာဖြစ်နေရင်ရော ?

[TypeError: Cannot read properties of (null or undefined) (reading 'username’)] ဆိုတဲ့ type error တက်ပြီး program crash သွားမှာပါ။

အဲတော့ user variable ဟာ object value တစ်ခုခု သိမ်းထားတယ်လို့ ကျိန်းသေ ယူဆလို့မရဘဲ nullish value တစ်ခုခုလည်း ဖြစ်နေနိုင်ရင် user variable သိမ်းထားတာ nullish များဖြစ်နေမလား ဆိုပြီး အရင်ဆုံးစစ်ဖို့လိုလာပါပြီ။

အဲတော့ ခုဏကcode ကို

const username = user && user.username

ဆိုပြီး ပြောင်းရေးရမှာပါ။ အဲတော့ user && ဟာ user ထဲက value တစ်ခုခု မထုတ်ခင် falsy value တစ်ခုခု များဖြစ်နေမလား ဆိုပြီးအရင် စစ်ပေးသွားမှာ (falsy မှာ nullish ဖြစ်တဲ့ null undefined အပြင် integer (0) empty string (“”) စသဖြင့် ပါပါသေးတယ်)။အကယ်၍ falsy သာဖြစ်နေရင် အဲ falsy value ကိုဘဲ username variable ထဲထည့်ပေးသွားပြီး အနောက်က code တွေဆက်မ run တော့လို့ ခုဏက type error လည်း မတက်တော့ပါဘူး။

အသုံးများတဲ့ optional chain 💡

ပြဿနာတစ်ခုက အဲ && syntax ဟာ nested object တွေကိုစစ်ဖို့ (short-circuiting လုပ်တယ်လို့လည်းခေါ် ) အတွက် အရမ်း verbose ဖြစ်လွန်းတာပါ။ ဥပမာ user object ထဲမှာရှိတဲ့ names ဆိုတဲ့ object ထဲက firstname ကို ခဏက type error safe ဖြစ်အောင် ထုတ်ချင်မယ်ဆိုရင်

const firstname = (user && user.names) && user.names.firstname

ဆိုပြီးရေးရမှာပါ။ အဲတာကို optional chain သာသုံးပြီးရေးရင်

const firstname = user?.names?.firstname

ဆိုပြီးတန်းရေးရုံပါဘဲ။ 💡 code ကအရမ်းရိုးရှင်းသွားမှာပါ။ ပြီးတော့ optional chain ဟာ && လို user or names သာ falsy value ဖြစ်ခဲ့ရင် အဲ falsy value ကို firstname ထဲကို တိုက်ရိုက်ထည့်သွားမှာမဟုတ်ဘဲ undefined ကိုဘဲ ထည့်ပေးသွားမှာဖြစ်လို့ unexpected behaviors (ဥပမာ firstname ထဲကို integer (0) ဝင်သွားတာမျိုး) တွေကိုပါ cover ဖြစ်စေပါသေးတယ်။

Type safe attribute retrieval တစ်ခုထက်ပိုတဲ့ optional chain 🛠️

Optional chain ကို object တစ်ခုခုထဲက attribute တစ်ခုခုရဲ့ value ကို type error မတက်အောင် ထုတ်တာအပြင် object ထဲက method တစ်ခုခုကို type error မတက်အောင် invoke လုပ်တဲ့နေရာတွေ

const speech = user?.speak?.()

လိုမျိုး၊

value တစ်ခုခုရှိမရှိ ပေါ်မူတည်ပြီး expression တစ်ခုခု run ချင်တာမျိုး -

ဥပမာ user variable ထဲမှာ hobbies ဆိုတဲ့ object ရှိနေရင် profileCompletion ဆိုတဲ့ variable ကို တစ်ပေါင်းပေးလိုက်တာမျိုး -

let profileCompletion = 0
withProfileRanking && user?.hobbies?.[profileCompletion++]

စတဲ့ အခြေအနေတွေမှာလည်း အထာကျကျသုံးလို့ရပါသေးတယ်။

တန်ဆေးလွန်ဘေး 🚬

Optional chain ဟာ အရမ်းသုံးဝင်ပေမယ့် မလိုတဲ့နေရာတွေမှာ သုံးမိရင် development process တွေ debugging process တွေကို နှောင့်နှေးစေပါတယ်။ (ဥပမာ ကျွန်တော်တို့ရဲ့ user variable ဟာ value တစ်ခုခု သိမ်းကိုသိမ်းထားသင့်တဲ့ mandatory variable တစ်လုံးဖြစ်မယ်ဆိုရင် type error တက်သွားတာက ပိုပြီး အဓိပ္ပာယ်ရှိပါတယ်။ အဲတာမှ လုပ်သင့်လုပ်ထိုက်တာတွေကို development phase မှာတင် ကြိုမြင် ကြိုပြင်ထားမိမှာပါ။)

နိဂုံးချုပ်

ဆိုတော့ ဒီ blog လေးကိုဖတ်ပြီး

✅ Optional chain ဆိုတာဘာလဲ ?

✅ Optional chain ဟာ ဘယ်လိုပြဿနာတွေကို ဖြေရှင်းပေးလဲ ?

✅ Optional chain ကိုဘယ်လိုနေရာတွေမှာသုံးလဲ ?

စတာတွေကို အကြမ်းဖျင်း သဘောပေါက်နားလည်သွားမယ်လို့ ယုံကြည်ပါတယ်။

ဖတ်ရှုပေးတဲ့အတွက် ကျေးဇူးပါဗျ။ ကျက်သရေရှိသောနေ့ရက်လေးကို ပိုင်ဆိုင်နိုင်ကြပါစေ။ 🤗

မှီငြမ်းနဲ့ ဆက်ဖတ်စေလိုသည်များ

https://javascript.info/optional-chaining

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

https://www.scaler.com/topics/javascript-optional-chaining/