TypeScriptУрок 16 из 16
Мини-проект: типизированный трекер задач
Финальный урок собирает всё вместе: интерфейс, объединение литералов, утилитарные типы и класс с приватным состоянием. Каркас готов — осталось дописать три метода.
Главное
- Priority — объединение литералов, а не enum.
- readonly id нельзя изменить после создания задачи.
- NewTask = Omit<Task, "id" | "done">: эти поля трекер заполняет сам.
- Record<Priority, number> задаёт порядок сортировки и не даст забыть приоритет.
- private tasks: снаружи список меняется только через методы.
Пример
type NoteStatus = "todo" | "done"; interface Note { readonly id: number; text: string; status: NoteStatus;} class NoteBook { private notes: Note[] = []; add(text: string): Note { const note: Note = { id: this.notes.length + 1, text, status: "todo" }; this.notes.push(note); return note; } finish(id: number): void { const note = this.notes.find((item) => item.id === id); if (note) note.status = "done"; } count(status: NoteStatus): number { return this.notes.filter((note) => note.status === status).length; }} const book = new NoteBook();book.add("Buy milk");book.add("Call Sam");book.finish(1);console.log(`todo: ${book.count("todo")}, done: ${book.count("done")}`);Пример — уменьшенная версия проекта: заметки со статусом, приватный массив и метод подсчёта. В задаче к этому добавляются сортировка по приоритету и статистика.
Задание
Как пользоваться редактором⌘ Enter или Ctrl Enter — запустить код, ⇧ ⌘ Enter — проверить задание.Tab и Shift Tab сдвигают строку или выделение; Esc, затем Tab — выйти из редактора.Проверка сравнивает то, что напечатала программа, с заданием; пробелы в конце строк не важны.После двух неудачных проверок можно открыть решение. Ваш код сохраняется в этом браузере.Допишите complete, pending и stats. Вывод: «Complete #2: true», «Complete #9: false», затем незавершённые задачи по приоритету — «[high] Review PR», «[medium] Write README», «[low] Update icons» — и «Done: 1, open: 3».
Вывод
Здесь появится то, что напечатает программа.