【问题标题】: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 会出错)。在这两种情况下,底层对象都将具有相同的原型/属性
  • 您的课程代码似乎不正确。您的意思是分配给类字段而不是 :

标签: typescript interface typescript-types


【解决方案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 使用来自CompanyEmployee 的所有属性,而这一行:

let comp: Company = new Employee()
comp.compName // ok
comp.emp_adr // error

意味着comp 只允许使用Company 属性,尽管它在运行时也包含Employee。这就像静态限制。

请参阅Type Compatibility

您可能还注意到Employee 是一个类,它在运行时和类型范围内都使用。这是打字稿类和枚举的特殊属性。它们都可以在两个范围内使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多