【问题标题】:extract data of one interface from another interface object which extends it从扩展它的另一个接口对象中提取一个接口的数据
【发布时间】:2019-09-11 19:48:25
【问题描述】:

我有下面的代码。是否可以从下面的 emp 变量中提取 Dept 对象数据?

    interface Dept{
        deptId: number;
        deptName: string;
    }


    interface Emp extends Dept{
        Id: number;
        Name: string;
    }

    let emp:Emp = {Id=1,Name='John',deptId=101,deptName='Sales'}
    console.log(emp.dept);//doesn't work

如果我在 Emp 接口中声明 Dept 类型变量而不是扩展 Dept 接口,我可以从 emp 对象中读取 dept 的各个属性。

但我想知道是否有更好的方法,我们可以在上面扩展 dept 接口的当前代码中指定类似 emp.dept 的内容并读取整个 dept 对象。

【问题讨论】:

  • Emp接口中的dept在哪里?

标签: typescript


【解决方案1】:

首先,您对emp 属性的分配无法编译。改用分号

let emp:Emp = {Id:1,Name:'John',deptId:101,deptName:'Sales'}

其次,您的对象中没有 dept 属性。但是您可以执行以下操作

console.log(emp.deptId);

如果你想拥有Dept 对象,你应该使用组合而不是继承

interface Emp {
        Id: number;
        Name: string;
        Dept : Dept;
}

let emp:Emp = {Id:1,Name:'John', Dept: {deptId: 101, deptName: 'Sales'}}

此外,我认为您应该prefer composition in that case。从部门继承员工是错误抽象的情况。根据经验,当类之间存在“is-a”关系时,您应该使用继承。 Employee 显然不是一个部门。

【讨论】:

    【解决方案2】:

    由于Emp 扩展了DeptEmp 就打字稿而言Dept。也就是说,您可以简单地这样做:

    const dept: Dept = emp;
    

    过滤属性的唯一原因是当您将 emp 传递给迭代所有属性的函数时,例如对意外属性产生异常的远程 API。

    唉,由于接口无法在转译中存活,运行时不知道您的接口包含哪些属性。因此,您必须明确指定要复制的属性。

    一种方法是使用解构赋值,或者通过指定要复制的属性:

    const {debtId, debtName} = emp;
    const dept = {deptId, debtName};
    

    或通过指定您不想复制的内容:

    const {Id, Name, ...dept} = emp;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2018-12-01
      • 2012-04-30
      相关资源
      最近更新 更多