// ########################## УЧЕБНЫЙ ТЕКСТ ############################################################ //****************************************************************************************************** interface People { name: string; age: number | undefined; } let people01: People = { name: "Kostya", age: undefined }; let people02: People = { name: "Yura", age: 32 } people01.age = 60; // console.log(people01); // console.log(JSON.stringify(people01)); // console.log(people01.age); console.log(`${people01.name} имеет возраст ${people01?.age ?? '40'}`); //Kostya --- 60 console.log(`${people02.name} имеет возраст ${people02?.age ?? '40'}`); //Yura --- 32 console.log(`${people01.name} имеет возраст ${people02?.age ?? '40'}`); interface PeopleLocation extends People { location: string; } let peopleLocation01: PeopleLocation = { name: "djdf", age: 42342, location: "dafdf" } class ProcessingPeoples implements PeopleLocation { name: string; age: number | undefined; location: string = ''; constructor(name: string){ this.name = name; } } let str: string = 'test text'; let proc1 = new ProcessingPeoples(str) console.log(proc1) proc1.name = 'new test' console.log(proc1) class ProcessingPeoplesExt extends ProcessingPeoples { isActive: boolean = false; constructor(name: string, isActive: boolean){ super(name); if(isActive) { this.location = 'Gorkyi street'; } else{ this.location = ''; } } } let a: ProcessingPeoples = new ProcessingPeoplesExt("Vasya", true); class Duck { type: string = 'Duck'; weight: number = 0; log(){ console.log("I'm simple duck"); } } let Utka: Duck = new Duck(); Utka.log(); interface Eateable { eat(): void; //пустота, функция ничего не принимает и не возвращает. } class GreyDuck extends Duck implements Eateable{ //наследоваться можно от другого класса только один раз, но!! реализация интерфейсов может быть не ограниченно количество раз constructor() { super(); // в данном примере, если используется конструктор и при этом этот конструктор наслеедуется от родителя, то мы обязаны вызывать конструктор родителя. this.type = 'GreyDuck' } override log(){ console.log("I'm grey duck"); } eat(){ console.log("I'm eat"); } } class RedDuck extends Duck implements Eateable { constructor() { super(); this.type = 'RedDuck' console.log(`Object created ${this.type}`) } eat(): void { console.log("I'm eat"); } override log(){ console.log("I'm red duck"); } } let duck1 = new RedDuck(); let duck2 = new GreyDuck(); let array: Eateable[] = [ duck1, duck2 ]; let result = array[0]; //мы можем проверить содержание массива с именем array. в квадратных скобках мы указали ноль = это первый эелемент массива. console.log(`результат содержимого массива${JSON.stringify(result)}`); //вывод на экран for (let item of array) { item.eat(); } let array2: Duck[] = [ duck2, duck1 ]; for (let item of array2) { item.log(); } array2.filter(item => "eat" in item); //тестирование не относится к тексту выше