打字稿在 类 中实现接口并将其分配给具有类型接口的对象
typescript implementing interfaces in classes and assigning it to a object with a type interface
我是 typescript 的新手,遇到了实现接口的 classes。我知道一个 class 可以添加接口没有的属性,但它必须包含接口具有的所有属性。我的问题是,当我从我的 class 中创建一个具有特定接口类型的新对象时,它会让人感到困惑。
我在辅导老师的网站上看到,下面的代码
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' does not exist on type 'IPerson'.
那么为什么 per.display() 设法记录 empCode,即使类型是没有 empCode 属性 的 Iperson amd。请你能帮我理解其中的区别吗
这是面向对象编程语言的标准行为。基本上当你这样做时:
let per:IPerson = new Employee(100, "Bill");
编译器只关心per
的类型,即IPerson
。 IPerson
没有 属性 empCode
。即使我们知道它是一个 Employee
并且它确实有一个 empCode
属性 编译器无法确定这一点!
当您执行 per.display()
时,empCode
是可访问的,因为此时您将在 Employee
class.
的范围内
我是 typescript 的新手,遇到了实现接口的 classes。我知道一个 class 可以添加接口没有的属性,但它必须包含接口具有的所有属性。我的问题是,当我从我的 class 中创建一个具有特定接口类型的新对象时,它会让人感到困惑。 我在辅导老师的网站上看到,下面的代码
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' does not exist on type 'IPerson'.
那么为什么 per.display() 设法记录 empCode,即使类型是没有 empCode 属性 的 Iperson amd。请你能帮我理解其中的区别吗
这是面向对象编程语言的标准行为。基本上当你这样做时:
let per:IPerson = new Employee(100, "Bill");
编译器只关心per
的类型,即IPerson
。 IPerson
没有 属性 empCode
。即使我们知道它是一个 Employee
并且它确实有一个 empCode
属性 编译器无法确定这一点!
当您执行 per.display()
时,empCode
是可访问的,因为此时您将在 Employee
class.