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

uyto3xhc  于 2023-01-24  发布在  Java
关注(0)|答案(4)|浏览(123)

我有一些类的crud API服务类,我想扩展它,但矛几个属性的考试,这是我的类

class Parent {
  public propertyToKeep: any;
  public propertyToDelete: any;
  constructor() { }
}

这是子类

class Child extends Parent {
  constructor() {
    super();
  }
}

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

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

ct2axkht1#

我刚刚遇到了与您相同的使用情形,我是这样做的:

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

那么你可以这样使用它:

class Child extends Omit(Parent, ['propertyToDelete']) {}

As you can see child only has one property now(它也适用于方法)。
@nestjs/swagger的包有一些很好的助手,如果你正在处理NestJS API的话。他们的实现更复杂,所以我猜他们保留了其他东西,比如他们自己的属性装饰器(我对Typescript很陌生,所以可能我错过了他们所做的一切的要点)。
附言:法国人第一次尝试用不太流利的英语回答,所以请友好一点。

zaqlnxep

zaqlnxep2#

下面是一种方法:

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"
  }
*/
laximzn5

laximzn53#

您需要使用Object.defineProperty函数,在描述符中进行限制,enumerabletofalsegettersetter具有特定条件,以下是一个完整的示例:

//A small example of how to make an invisible property in Child class.

class Parent{
 
 constructor(){
 
  this.propertyToKeep = "Visible";
  this.propertyToDelete = "Not visible in subclass child";
 
 }
}

Object.defineProperty(Parent.prototype, "propertyToDelete",  {enumerable: false,
 configurable: true,
 get: function(){
     if(!(this instanceof Child)){

        return this._propertyToDelete;
     }
 },
 set: function(v){
    
    if(!(this instanceof Child)){

        this._propertyToDelete = v;
    }
    

 }});

 Object.freeze(Parent.prototype);

class Child extends Parent {
  constructor() {
    super();
  }
}

//console.log(Child.prototype);

let chd = new Child();

console.log("Child: --------------------------------");

console.log(chd);

console.log(chd.propertyToDelete); //Undefined

console.log("Parent: -------------------------------");

let prt = new Parent();

console.log(prt);

console.log(prt.propertyToDelete); //"Not visible in subclass child"

/*let chdObj = Object.getOwnPropertyDescriptors(Child.prototype);

console.log(chdObj);*/

class SomeComponent{

  #child;

  constructor(child) {
    
    this.#child = child;

    

    console.log(this.#child); //{propertyToKeep: "Visible"}

    console.log(this.#child.propertyToKeep /*work*/);
    
    console.log(this.#child.propertyToDelete /*undefined*/);

  }
}

//Now i will invoke SomeComponent

console.log("SomeComponent: -------------------------");

let sc = new SomeComponent(new Child());
flvlnr44

flvlnr444#

这是不可能的。如果你在父类中声明了一个属性,你就不能限制它在子类中的可见性。
从模型设计的Angular 来看,这也是没有意义的。您在这里暴露的问题表明您的类层次结构没有设计好,您必须重新思考和重新设计它。

相关问题