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