2016-12-22 2 views
1

У меня есть абстрактный класс Section, который будет использоваться для представления раздела документа, который может быть действительным или недействительным. Такие секции также могут иметь встроенные разделы. Раздел не может быть действительным, если он содержит недопустимый внутренний раздел.Получить значения свойств свойств, полученных из определенного типа в TypeScript?

я создал классы ASection1 и ASection2 с целью использовать их в качестве внутренних секций MySection, к которому процесс валидации вызываются с помощью performValidation().

Как получить свойства типов, полученных из класса MySection. Мне нужна помощь в абстрактной логике отражения класса, как это прокомментировано ниже.

abstract class Section { 

    constructor(public name: string) { 
    } 

    performValidation(): boolean { 

     let result: boolean = true; 

     //HELP IS NEEDED HERE!!! 
     //get all properties of this instance 
     //whose type inherit from "Section" 
     //and execute Validate() on each of them 
     //one at a time, if any of them returns 
     //false, return false. 

     return this.Validate(); 
    } 

    abstract Validate(): boolean; 
} 

class ASection1 extends Section { 
    constructor() { 
     super("Section example 1"); 
    } 
    Validate(): boolean { 
     //validation logic goes here 
    } 
} 

class ASection2 extends Section { 
    constructor() { 
     super("Section example 2"); 
    } 
    Validate(): boolean { 
     //validation logic goes here 
    } 
} 

class MySection extends Section { 

    constructor() { 
     super("My Section"); 
    } 

    subsection1: ASection1; 
    subsection2: ASection2; 

    prop1: number; 

    Validate(): boolean { 
     return this.prop1 > 100; 
    } 

} 

//run 

let mySect = new MySection(); 
mySect.prop1 = 101; 
mySect.subsection1 = new ASection1(); 
mySect.subsection2 = new ASection2(); 
mySect.performValidation(); 

Спасибо.

+1

Почему бы вам не просто сохранить разделы в массиве карты, а не неизвестные индивидуальные свойства? –

ответ

0

если у вас есть 2 или больше свойств того же типа и того же значения каждый раз, когда используйте массив вместо каждого свойства. Я добавляю массив подсетей в каждый подраздел. При проверке я проверяю каждый подраздел, если какой-либо цикл проверки отката подсекции возвращает false, если проверка валидации подсекции не проходит, валидация продолжается, проверяя себя.

abstract class Section { 
    protected subsections: Array<Section> = []; 

    constructor(public name: string) { 
    } 

    performValidation(): boolean { 

     let result: boolean = true; 

     for (var i = 0; i < this.subsections.length; i++) { 
      if (!this.subsections[i].Validate()) { 
       return; 
      } 
     } 

     return this.Validate(); 
    } 

    public addSubsection(section: Section) { 
     this.subsections.push(section); 
    } 

    abstract Validate(): boolean; 
} 

class ASection1 extends Section { 
    constructor() { 
     super("Section example 1"); 
    } 

    Validate(): boolean { 
     //validation logic goes here 
    } 
} 

class ASection2 extends Section { 
    constructor() { 
     super("Section example 2"); 
    } 
    Validate(): boolean { 
     //validation logic goes here 
    } 
} 

class MySection extends Section { 

    constructor() { 
     super("My Section"); 
    } 

    prop1: number; 

    Validate(): boolean { 
     return this.prop1 > 100; 
    } 

} 

//run 

let mySect = new MySection(); 
mySect.prop1 = 101; 
mySect.addSubsection(new ASection1()); 
mySect.addSubsection(new ASection2()); 
mySect.performValidation(); 
Смежные вопросы