Thuta Learning
ရှာဖွေရန်
ProjectsProgrammingintermediate

Mini Project: Task Manager - Part 1 (Setup & Structure)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Mini Project: Task Manager - Part 1 (Setup & Structure) ကို လက်တွေ့ project ထဲမှာ အသုံးချတတ်မယ်
  • ကိုယ်တိုင် code ရေးပြီး run ကြည့်တတ်မယ်
  • Project တစ်ခုလုံးကို အဆင့်လိုက် ဆောက်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ project မှာ command-line ပေါ်တွင် အလုပ်လုပ်တဲ့ simple Task Manager တစ်ခုကို TypeScript ဖြင့် တည်ဆောက်ပါမည်။ Part 1 မှာတော့ project ရဲ့ data shape ကို အရင်ဆုံး design လုပ်ဖို့ လိုအပ်ပါတယ်။ Task တစ်ခုစီမှာ id, title, status, priority စတာတွေ ပါဝင်ရမှာဖြစ်လို့ interface တစ်ခုဖြင့် သတ်မှတ်ပြီး၊ status အတွက်တော့ possible value တွေကို enum ဖြင့် ကန့်သတ်ပါမယ်။ Basic types (string, number, boolean) နဲ့ arrays, functions တွေကို ပြန်လည်အသုံးပြုပြီး foundation ကောင်းကောင်း ချမှတ်ခြင်းက နောက်ပိုင်း feature တွေ ထည့်ဖို့ အထောက်အကူဖြစ်စေပါတယ်။ Type safety ရှိတဲ့ data structure ကနေ project ကို စတင်ခြင်းက bug နည်းသော code ဖြစ်စေမှာ ဖြစ်ပါတယ်။

လက်တွေ့ ဆောက်ကြည့်မယ်

Task interface တစ်ခုကို id: number, title: string, status: TaskStatus, priority: "low" | "medium" | "high" ဆိုပြီး field များနှင့်အတူ ဖန်တီးပါ။ TaskStatus ဆိုတဲ့ enum ကို Todo, InProgress, Done ဆိုတဲ့ member သုံးခုနဲ့ ဖန်တီးပါ။ Task[] type ဖြင့် tasks: Task[] = [] array တစ်ခု ဖန်တီးပြီး၊ addTask(task: Task): void နှင့် listTasks(): void ဆိုတဲ့ function နှစ်ခုကို implement လုပ်ပါ။ listTasks() function ထဲမှာ tasks array ကို loop ပတ်ပြီး title, status, priority တွေကို console.log ဖြင့် ပုံစံကျကျ ပြသပါ။ နောက်ဆုံး sample task နှစ်ခုကို addTask() ဖြင့် ထည့်ပြီး listTasks() ခေါ်ကြည့်ပါ။

Code နမူနာ

typescript
enum TaskStatus {
  Todo = "TODO",
  InProgress = "IN_PROGRESS",
  Done = "DONE",
}

interface Task {
  id: number;
  title: string;
  status: TaskStatus;
  priority: "low" | "medium" | "high";
}

let tasks: Task[] = [];
let nextId = 1;

function addTask(title: string, priority: Task["priority"]): void {
  const task: Task = {
    id: nextId++,
    title,
    status: TaskStatus.Todo,
    priority,
  };
  tasks.push(task);
}

function listTasks(): void {
  tasks.forEach((t) => {
    console.log(`#${t.id} [${t.status}] ${t.title} (${t.priority})`);
  });
}

addTask("Learn TypeScript generics", "high");
addTask("Write project README", "low");

listTasks();
You should see
Console တွင် task နှစ်ခု၏ id, status, title, priority များကို line တစ်ခုစီ ပုံစံကျကျ ပြသပေးမည်။

၅ မိနစ် စမ်းကြည့်

Task interface ထဲသို့ dueDate: string ဆိုတဲ့ optional field (dueDate?: string) တစ်ခု ထပ်ထည့်ပြီး၊ task အသစ်တစ်ခုကို dueDate ပါအောင် ထည့်ကြည့်ပါ။

သတိလေးတစ်ချက်

Project ရဲ့ data shape ကို အစပိုင်းမှာ well-defined interface ဖြင့် သေချာ ဖွဲ့စည်းထားလျှင် Part 2 နှင့် Part 3 မှာ feature အသစ်တွေ ထည့်ရာတွင် bug ဖြစ်နိုင်ခြေ သိသိသာသာ လျော့ကျပါလိမ့်မယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • enum member value များကို string ဖြင့်မသတ်မှတ်ဘဲ default numeric value ကိုပဲ အားကိုးခြင်းက log output ကို ဖတ်ရခက်စေတတ်သည်
  • priority field ကို union type ("low" | "medium" | "high") အစား string ဟု ကျယ်ပြန့်စွာ သတ်မှတ်လိုက်ခြင်းကြောင့် typo တစ်ခု ရေးမိလျှင် compiler က catch မလုပ်နိုင်တော့ခြင်း

အခု ကိုယ်တိုင် စမ်းကြည့်

Task interface ထဲသို့ dueDate: string ဆိုတဲ့ optional field (dueDate?: string) တစ်ခု ထပ်ထည့်ပြီး၊ task အသစ်တစ်ခုကို dueDate ပါအောင် ထည့်ကြည့်ပါ။

You'll know it worked when: Console တွင် task နှစ်ခု၏ id, status, title, priority များကို line တစ်ခုစီ ပုံစံကျကျ ပြသပေးမည်။

Mini Project: Task Manager - Part 1 (Setup & Structure) | Thuta Learning