我想从一个类扩展但删除一些属性

Mor*_*gig 9 javascript oop class typescript angular

我有一些用于 CRUD API 服务类的类,我想扩展它,但为了考试而放弃了一些属性,这是我的类

class Parent {
  public propertyToKeep: any;
  public propertyToDelete: any;
  constructor() { }
}
Run Code Online (Sandbox Code Playgroud)

这是儿童班

class Child extends Parent {
  constructor() {
    super();
  }
}
Run Code Online (Sandbox Code Playgroud)

我不想查看和访问的另一个文件

export class comeComponent {
  constructor(private child: Child) {
    this.child.propertyToKeep // work
    this.child.propertyToDelete // error and I can't even see it
  }
}
Run Code Online (Sandbox Code Playgroud)

vic*_*707 26

我刚刚遇到了与您相同的用例,这就是我的做法:

const Omit = <T, K extends keyof T>(Class: new () => T, keys: K[]): new () => Omit<T, typeof keys[number]> => Class;
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

class Child extends Omit(Parent, ['propertyToDelete']) {}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,child 现在只有一个属性(它也适用于方法)。

如果您正在处理 NestJS API,@nestjs/swagger中的包有一些很好的帮助器。他们的实现更加复杂,所以我猜他们保留了其他东西,比如他们自己的属性装饰器(我对 Typescript 很陌生,所以也许我错过了他们所做的一切的重点)。

PS:法国小伙第一次尝试用不完美的英语回答所以请友善^^

  • 这有效!但是假设父类是带有 class-validator 注解的 DTO,子类是否也会继承父类上设置的验证规则呢? (2认同)

小智 8

这是一种方法:

class Parent {
  propertyToKeep = 'hi';
  propertyToDelete = 'bye';
  constructor() {}
}

class Child extends Parent {
  constructor() {
    super();
    delete this.propertyToDelete;
  }
}

const myObject = new Child();

console.log(myObject);
/* OUTPUT:
  {
    "propertyToKeep": "hi"
  }
*/
Run Code Online (Sandbox Code Playgroud)