۱۱

پروژه ۱: لیست کارها با TypeScript

بازسازی پروژه لیست کارها، این بار با قدرت و امنیت تایپ‌اسکریپت.

پیش‌نمایش پروژه

    کد کامل پروژه

    تفاوت اصلی با نسخه جاوااسکریپت، تعریف یه `interface` برای `Task` و تایپ‌بندی متغیرها و توابعه که باعث می‌شه کد خیلی امن‌تر و خواناتر بشه.

    app.ts
    // تعریف شکل یک "کار"
    interface Task {
      id: string;
      text: string;
      completed: boolean;
    }
    
    // گرفتن عناصر DOM با Type Assertion
    const taskInput = document.getElementById('task-input') as HTMLInputElement;
    const addTaskBtn = document.getElementById('add-task-btn') as HTMLButtonElement;
    const taskList = document.getElementById('task-list') as HTMLUListElement;
    
    // آرایه‌ای برای نگهداری کارها
    let tasks: Task[] = [];
    
    function addTask() {
      const taskText = taskInput.value.trim();
      if (taskText === "") return;
    
      const newTask: Task = {
        id: Date.now().toString(),
        text: taskText,
        completed: false,
      };
      
      tasks.push(newTask);
      renderTasks();
      
      taskInput.value = "";
      taskInput.focus();
    }
    
    function renderTasks() {
        taskList.innerHTML = "";
        tasks.forEach(task => {
            const li = document.createElement('li');
            li.className = `task-item flex items-center justify-between p-3 rounded-lg ${task.completed ? 'bg-green-100 dark:bg-green-900/30' : 'bg-muted/50'}`;
            
            li.innerHTML = `
                <span class="${task.completed ? 'line-through text-muted-foreground' : ''}">${task.text}</span>
                <div class="flex gap-2">
                    <button class="text-green-500 complete-btn"><i class="fas fa-check"></i></button>
                    <button class="text-red-500 delete-btn"><i class="fas fa-trash"></i></button>
                </div>
            `;
    
            li.querySelector('.complete-btn')?.addEventListener('click', () => {
                task.completed = !task.completed;
                renderTasks();
            });
    
            li.querySelector('.delete-btn')?.addEventListener('click', () => {
                tasks = tasks.filter(t => t.id !== task.id);
                renderTasks();
            });
            
            taskList.appendChild(li);
        });
    }
    
    addTaskBtn.addEventListener('click', addTask);
    taskInput.addEventListener('keypress', (e) => {
      if (e.key === 'Enter') addTask();
    });