प्रतिलिपि प्रस्तुत करने योग्य उदाहरण यहां

मेरी आवश्यकता है: contentType पैरामीटर को सामग्री (सार्वजनिक सामग्री, व्यवस्थापक सामग्री, निजी सामग्री, आदि) से विस्तारित किसी भी वर्ग वस्तु को स्वीकार करना चाहिए और मैं execute विधि के अंदर इस पैरामीटर प्रकार से एक स्थिर विधि को कॉल करना चाहता हूं।

मेरे पास निम्नलिखित हस्ताक्षर के साथ एक विधि है:

async execute<U extends ContentProps>(input: {
    contentType: typeof Content;
    contentPropsType: typeof ContentProps; 
}): Promise<Result<U, Failure>>;

और एक वर्ग पदानुक्रम इस प्रकार है:

// content.entity.ts

export class ContentProps extends EntityProps {}

export class Content<T extends ContentProps> extends Entity<T> {
  public constructor(props: T) {
    super(props);
  }
}

// public-content.entity.ts
export class PublicContentProps extends ContentProps {
  readonly title: string;
  readonly text: string;
}

export class PublicContent extends Content<PublicContentProps> {
  constructor(props: PublicContentProps) {
    super(props);
  }
  // ommited
}

मुद्दा यह है कि जब मैं execute विधि को PublicContent को contentType पैरामीटर के रूप में पास करने के लिए कहता हूं, तो मुझे यह कहते हुए एक त्रुटि हो रही है

'टाइपऑफ पब्लिककंटेंट' टाइप करें 'टाइपऑफ कंटेंट' टाइप करने के लिए असाइन करने योग्य नहीं है

विधि कॉल है:

const result = await this.getContent.execute({
  contentType: PublicContent,
  contentPropsType: PublicContentProps,
});

मेरा प्रश्न है: मुझे यह त्रुटि क्यों मिल रही है क्योंकि PublicContent, Content को बढ़ा रहा है?

संपादित करें: @Chase के अनुरोध के अनुसार, Entity और EntityProps के लिए पूर्ण प्रकार:

// entity.ts
export abstract class EntityProps extends BaseEntityProps {
  id?: string;
  createdAt?: Date;
  updatedAt?: Date;
}

export abstract class Entity<T extends EntityProps> extends BaseEntity<T> {
  get id(): string {
    return this.props.id;
  }

  get createdAt(): Date {
    return this.props.createdAt;
  }

  get updatedAt(): Date {
    return this.props.updatedAt;
  }

  protected constructor(entityProps: T) {
    super(entityProps);
  }
}


// base.entity.ts
export abstract class BaseEntityProps {}

export abstract class BaseEntity<T extends BaseEntityProps> extends Equatable {
  protected readonly props: T;

  protected constructor(baseEntityProps: T) {
    super();
    this.props = baseEntityProps;
  }

  static create<T = BaseEntity<BaseEntityProps>, U = BaseEntityProps>(
    this: {
      new (entityProps: U): T;
    },
    propsType: { new (): U },
    props: U,
  ): Result<T, ValidationFailure> {
    const violations = validateSchemaSync(propsType, props);

    return violations?.length
      ? Result.fail(new ValidationFailure(violations))
      : Result.ok(new this({ ...props }));
  }

  toJSON(): T {
    return this.props;
  }
}
1
Bruno Peres 11 फरवरी 2021, 20:41

1 उत्तर

Content को IContent की तरह एक सरल इंटरफ़ेस लागू करने का प्रयास करें, और execute पैरामीटर पर typeof प्राप्त करने के लिए इस इंटरफ़ेस का उपयोग करें

1
André Smaniotto 11 फरवरी 2021, 21:09