@Mikenzzz

Как расширить класс (добавить новый атрибут к объекту класса) программно?

Следующая ситуация:
Предположим есть следующие классы (псевдокод TypeScript):
class Project {
  id: number;
  name: string;
  stages: Stage[];
  constructor() {
    this.stages = []
  }
}

class Stage {
  id: number;
  name: string;
  jobs: Job[];
  constructor() {
    this.jobs= []
  }
}

class Job {
  id: number;
  name: string;
}

У нас есть список проектов (Project[]), к которому привязаны этапы работ (Stage[]), к которым привязаны конкретные работы (Job[]).
Есть форма со списком проектов, можно провалиться в конкретный проект. На форме изменения проекта можно к проекту привязать (добавить) конкретные этапы и работы, отметив их чекбоксами. Но в классах Stage и Jobs нет атрибута checked: boolean. Как программно добавить атрибут? Как и где хранить объеты, у которых checked === true, чтобы потом put запросом обновить проект на бэкенде?

Вот небольшой пример компоненты на Angular:
@Component 
export class ProjectFormComponent implements OnInit {
 constructor (private projectService: ProjectService) { }
 projects: Projects[];
 
 onInit() {
   this.projectService.getPorjects()
             .subscribe(projects => this.projects = projects);
 }

 OnEditProjectButtonClick(project) {
    this.projectService.getStageByProjectID(project)
               .subscribe(stages => {
                  project.stages = stages (как то нужно добавить атрибут checked к объекту stages)
                  project.stages.filter(stage => stage.checked) (но у нас нет свойства checked)
             }
  }
}

Шаблон:
<ul>
    <li *ngFor="let stage of project.stages">
       <input type="checkbox" [checked] = "stage.checked" (вот здесь необходимо свойство checked, а его нет в классе)
        {{stage.name}}
    </li>
</ul>
  • Вопрос задан
  • 436 просмотров
Решения вопроса 1
@denismaster
можно stage['checked'] использовать.
Либо (stage as any).checked
Наконец, можно определить интерфейс IChecked и типизировать:
stage: Stage & IChecked
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы