Typescript在类中实现接口,并将其分配给具有类型接口的对象

时间:2019-02-06 15:14:59

标签: typescript class interface interface-implementation

我是TypeScript的新手,遇到了实现接口的类。我知道一个类可以添加该接口所没有的属性,但是它必须包含该接口所具有的所有属性。我的问题是,当我使用某个接口类型从类中创建一个新对象时,它会造成混乱。 我在补习老师的网站上看到了以下代码

   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”。

所以,即使类型是没有empCode属性的Iperson amd,为什么per.display()仍设法记录empCode。请您能帮助我了解其中的区别

1 个答案:

答案 0 :(得分:1)

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

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

编译器只关心per的类型,即IPersonIPerson不具有属性empCode。即使我们知道它是Employee且确实具有empCode属性,编译器也无法确定这一点!

进行per.display()时,可以访问empCode,因为此时您将进入Employee类的范围内。