0

我是打字稿的新手,遇到了实现接口的类。我知道一个类可以添加接口没有的属性,但它必须包含接口具有的所有属性。我的问题是当我从我的类中创建一个具有某种接口类型的新对象时,它会变得混乱。我在辅导老师的网站上看到,下面的代码

   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)会有一个编译器错误说

“IPerson”类型上不存在属性“empCode”。

那么为什么 per.display() 设法记录 empCode 即使类型是没有 empCode 属性的 Iperson amd 。请你能帮我理解其中的区别吗

4

1 回答 1

1

这是面向对象编程语言中的标准行为。基本上当你这样做时:

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

编译器只关心peris的类型IPersonIPerson没有财产empCode。即使我们知道它是 anEmployee并且 this 确实有一个empCode属性,编译器也不能确定地知道这一点!

当你这样做时per.display(),它empCode是可访问的,因为那时你将在Employee类的范围内。

于 2019-02-06T15:26:21.527 回答