类实现接口并拥有自己的新成员的类对象的类型是啥
Posted
技术标签:
【中文标题】类实现接口并拥有自己的新成员的类对象的类型是啥【英文标题】:what will be the type of class object where the class implements an interface and also has it own new members类实现接口并拥有自己的新成员的类对象的类型是什么 【发布时间】:2022-01-14 22:33:45 【问题描述】:我是 OOP 和 typescript 的新手,所以这里是示例代码
interface Company
compName:string;
compId: number;
compAdree:string;
class Employee implements Company
compName="fb";
compId=83487;
compAdree="NY";
emp_name="peter";
emp_id=99348493;
emp_adr="Ny"
所以在上面的代码中,Employee 类正在实现接口 company,该类有一些不在接口中的新成员,所以如果我创建 Employee 类的对象,该对象的类型是什么?
我遇到了一些代码,其中它是类类型,而在某些代码中是接口类型。所以我很困惑该使用哪个
会不会
let emp:Employee = new Employee()
还是会
let emp:Company = new Employee()
【问题讨论】:
两者都有效。在第二个示例中,您将被允许仅使用界面中列出的成员(例如,emp.compName
可以,但emp.emp_adr
会出错)。在这两种情况下,底层对象都将具有相同的原型/属性
您的课程代码似乎不正确。您的意思是分配给类字段而不是 :
?
【参考方案1】:
您可以将Company
视为超类型,将Employee
视为子类型。这意味着Employee
可以分配给Company
。
考虑这个例子:
interface Company
compName: string;
compId: number;
compAdree: string;
class Employee implements Company
compName: "fb";
compId: 83487;
compAdree: "NY";
emp_name: "peter";
emp_id: 99348493;
emp_adr: "Ny"
declare let company: Company;
declare let employee: Employee;
company = employee // ok
但反之亦然:
employee=company // error
让我们回到原来的例子。 这一行:
let emp:Employee = new Employee()
emp.compName // ok
emp.emp_adr // ok
表示允许emp
使用来自Company
和Employee
的所有属性,而这一行:
let comp: Company = new Employee()
comp.compName // ok
comp.emp_adr // error
意味着comp
只允许使用Company
属性,尽管它在运行时也包含Employee
。这就像静态限制。
请参阅Type Compatibility。
您可能还注意到Employee
是一个类,它在运行时和类型范围内都使用。这是打字稿类和枚举的特殊属性。它们都可以在两个范围内使用。
【讨论】:
以上是关于类实现接口并拥有自己的新成员的类对象的类型是啥的主要内容,如果未能解决你的问题,请参考以下文章