Машинопись реализует интерфейсы в классах и присваивает их объекту с интерфейсом типа

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

   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) будет ошибка компилятора, говорящая

Свойство empCode не существует для типа "IPerson".

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам