Type Annotation(:) နဲ့ Type Assertion (as) ရဲ့ ပြဿနာ
Type Annotation (:) ကြောင့် ဖြစ်တဲ့ ပြဿနာ: Type ကျယ်ပြန့်သွားခြင်း (The Widening Effect)
Section titled “Type Annotation (:) ကြောင့် ဖြစ်တဲ့ ပြဿနာ: Type ကျယ်ပြန့်သွားခြင်း (The Widening Effect)”ပြီးခဲ့တဲ့ သင်ခန်းစာက myAppConfig က AppConfig ဖြစ်ကြောင်း type annotation ကို သုံးပြီး သေချာအောင် လုပ်ချင်ရင် ဘာဖြစ်မလဲ။
const annotatedConfig: AppConfig = { // AppConfig နဲ့ Type annotation လုပ်လိုက်တယ်။ env: "development", port: 3000, featureFlags: { darkMode: true, newOnboarding: false }};
ဒီလို annotatedConfig: AppConfig လို့ ရေးလိုက်တာနဲ့ TypeScript က annotatedConfig အကြောင်း ဘာတွေသိလဲ ကြည့်ရအောင်။”
- annotatedConfig.env: သူ့ရဲ့ Type က အခု “development” | “production” | “test” ဖြစ်သွားပြီ။
- အရေးကြီးတာက “development” လို့ အတိအကျ သိခဲ့တဲ့ အသေးစိတ် အချက်အလက်က ပျောက်သွားပြီ။ TypeScript က ‘ဒီ env က သုံးခုထဲက တစ်ခုခုပဲ ဖြစ်နိုင်တယ်။ ဘယ်ဟာလဲဆိုတာ အတိအကျ တော့ မသိတော့ဘူး’ လို့ ဖြစ်သွားတယ်။
- annotatedConfig.featureFlags: သူ့ရဲ့ Type က Record<string, boolean> ဖြစ်တယ်။
- ဒီမှာလည်း ပြဿနာက darkMode နဲ့ newOnboarding ဆိုတဲ့ Key တွေ ပါတယ်ဆိုတာ TypeScript က မသိတော့ဘူး။ သူက ‘Key က စာသား ဖြစ်ရမယ်၊ Value က true/false ဖြစ်ရမယ်’ လို့ပဲ ယေဘုယျ သိတော့တယ်။
အဓိက ပြဿနာက (The Crux)
Section titled “အဓိက ပြဿနာက (The Crux)”အကယ်၍ ကျွန်တော်တို့က annotatedConfig.featureFlags.darkMode လိုမျိုး အတိအကျ access လုပ်ဖို့ ကြိုးစားရင်
// console.log(annotatedConfig.featureFlags.darkMode);// ^^^^ Error ပြလိမ့်မယ်: Property 'darkMode' does not exist on type 'Record<string, boolean>'.// TypeScript က 'featureFlags' ထဲမှာ string key မျိုးစုံက boolean ကို ပြန်ပေးနိုင်တယ်လို့ပဲ သိတယ်။// 'darkMode' ဆိုတာ အတိအကျ ပါတယ်လို့ မသိတော့ဘူး။
တစ်စိတ်တစ်ပိုင်း ဖြေရှင်းနည်း: as const
Section titled “တစ်စိတ်တစ်ပိုင်း ဖြေရှင်းနည်း: as const”ဒီပြဿနာကို ခဏဖြေရှင်းဖို့ as const ဆိုတာ သုံးလို့ရတယ်။
const constConfig = { env: "development", port: 3000, featureFlags: { darkMode: true, newOnboarding: false }} as const; // ဒီ Object ကို 'as const' လို့ ပြောလိုက်တယ်။
// ဒါဆိုရင် TypeScript က constConfig အကြောင်း ဒီလို အသေးစိတ် သိသွားမယ်:// {// readonly env: "development"; // 'development' လို့ အတိအကျ သိတယ်။ ပြီးတော့ ပြင်လို့မရဘူး (readonly)။// readonly port: 3000; // 3000 လို့ အတိအကျ သိတယ်။ ပြီးတော့ ပြင်လို့မရဘူး။// readonly featureFlags: {// readonly darkMode: true; // 'darkMode' ပါတယ်လို့ အတိအကျ သိတယ်။ ပြင်လို့မရဘူး။// readonly newOnboarding: false; // 'newOnboarding' ပါတယ်လို့ အတိအကျ သိတယ်။ ပြင်လို့မရဘူး။// };// }