машинопись реализует интерфейсы в классах и присваивает их объекту с интерфейсом типа - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в машинописи и наткнулся на классы, которые реализуют интерфейс.Я знаю, что класс может добавлять свойства, которых не было в интерфейсе, но он должен содержать все свойства интерфейса.Моя проблема в том, что когда я делаю новый объект из моего класса с типом определенного интерфейса, это сбивает с толку.Я видел на сайте преподавателей учебных пособий следующий код

   interface IPerson {
        name: string;
        display():void;
    }

    interface IEmployee {
        empCode: number;
    }

    class Employee implements IPerson, IEmployee {
        empCode: number;
        name: string;

        constructor(empcode: number, name:string) {
            this.empCode = empcode;
            this.name = name;
        }

        display(): void {
            console.log("Name = " + this.name +  ", Employee Code = " + this.empCode);
        }
    }

    let per:IPerson = new Employee(100, "Bill");
    per.display(); // Name = Bill, Employee Code = 100

    let emp:IEmployee = new Employee(100, "Bill");
    emp.display(); //Compiler Error: Property 'display' does not exist on type IEmployee'

Если после let per:IPerson = new Employee(100, "Bill"); я бы console.log(per.empCode) произошла ошибка компилятора, говорящая

Property 'empCode'не существует для типа' IPerson '.

Так почему per.display () удается зарегистрировать empCode, даже если тип является Iperson amd, у которого нет свойства empCode.Пожалуйста, вы можете помочь мне понять разницу

1 Ответ

0 голосов
/ 06 февраля 2019

Это стандартное поведение в объектно-ориентированном языке программирования.В основном, когда вы делаете:

let per:IPerson = new Employee(100, "Bill");

Компилятор заботится только о типе per, который IPerson.IPerson не имеет свойства empCode.Даже если мы знаем, что это Employee и у него есть свойство empCode, компилятор не может знать это наверняка!

Когда вы делаете per.display(), empCode доступен, потому что в этот моментвы будете находиться внутри области Employee класса.

...