クラスデコレータを継承チェーンの最も外側のクラスでのみ実行するにはどうすればよいですか?

ダイナマイト

私が使用しているクラスのバリデータの実行時に自分のアプリケーションの外部からのデータを必要とするデータクラスを検証するためにデコレータを。クラスがインスタンス化で自分自身を検証することを望んでいます。この機能をクラスに簡単に追加できるように、クラスデコレータを作成しました。

import * as t from 'class-validator';

interface Class {
  new(...args: any[]): {};
}

export function autoValidate<T extends Class>(target: T) {
  return class extends target {
    constructor(...args: any[]) {
      super(...args);

      const errors = t.validateSync(this);

      if (errors.length > 0) {
        throw errors;
      }
    }
  };
}

このクラスデコレータの問題は、継承が機能するときに、クラスとその祖先の両方がこのデコレータで装飾されることです。

@autoValidate
class Parent {
  @t.IsNumber()
  readonly age: number;

  @t.IsString()
  readonly name: string;

  constructor(age: number, name: string) {
    this.age = age;
    this.name = name;
  }
}

@autoValidate
class Child extends Parent {
  @t.IsBoolean()
  readonly happy: boolean;

  constructor(age: number, name: string, happy: boolean) {
    super(age, name);

    this.happy = happy;
  }
}

ときにChildインスタンス化され、バリデータがでエラーがスローされますParentのコンストラクタのデコレータsuperで呼ばれているChildので、コンストラクタ/デコレータ"happyですundefined

thisがのインスタンスでtargetあり、の子孫ではない場合にのみ検証コードを実行するように、デコレータを変更するにはどうすればよいtargetですか?

マット・マッカッチェン

パトリック・ロバーツのアイデアに基づいたソリューションで、サブクラスの定義と忘却に対する追加の保護@autoValidateがあります(そうしないと、検証がまったく行われません)。

import * as t from 'class-validator';

interface Class {
  new(...args: any[]): {};
}

const lastClassWithValidation = Symbol();
export function autoValidate<T extends Class>(target: T) {
  return class extends target {
    static [lastClassWithValidation] = target;
    constructor(...args: any[]) {
      super(...args);

      if ((<any>this.constructor)[lastClassWithValidation] === target) {
        const errors = t.validateSync(this);

        if (errors.length > 0) {
          throw errors;
        }  
      }
    }
  };
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++では、クラスが継承チェーンの最後のクラス/子であるかどうかを確認するにはどうすればよいですか?つまり、基本クラスの反対側にあります

分類Dev

クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

分類Dev

親クラスに C++ のデフォルト コンストラクターがない場合、継承されたクラスでコンストラクターを使用するにはどうすればよいですか?

分類Dev

デコレータを使用してクラスジェネリック型の実行時型を取得するにはどうすればよいですか?

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

継承チェーンの途中にクラスを挿入するにはどうすればよいですか?

分類Dev

継承されるデータクラスにオプションのフィールドを作成するにはどうすればよいですか?

分類Dev

継承チェーン内のすべてのクラスの属性を返すにはどうすればよいですか?

分類Dev

プライベートコンストラクターを持つクラスがこのクラスからの継承を妨げないのはなぜですか?特定のベースから継承できるクラスを制御するにはどうすればよいですか?

分類Dev

WebTestから継承するクラスのコードから実行設定->コンテキストパラメータにアクセスするにはどうすればよいですか?

分類Dev

スタンドアロンクラスターの最後のタスクの実行時間を改善するにはどうすればよいですか?

分類Dev

PHPのクラス継承で親メソッドのみを実行するにはどうすればよいですか?

分類Dev

Collection <>を継承するクラス内のコレクションにアクセスするにはどうすればよいですか?

分類Dev

別のファイルのクラス外のクラスコンストラクターを定義するにはどうすればよいですか?

分類Dev

継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

分類Dev

継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

分類Dev

すでに実行中のインスタンスのJavaクラスのコードを変更するにはどうすればよいですか?

分類Dev

コンパイル時にクラスが継承するものを変更するにはどうすればよいですか?

分類Dev

データフレームの「範囲外のインデックス」エラーを修正するにはどうすればよいですか?

分類Dev

継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

分類Dev

内部デコレータクラスからクラスのインスタンスにアクセスするにはどうすればよいですか?

分類Dev

抽象クラスから継承する文字列を使用して実行時にクラスの型を取得し、取得した型をパラメーターとして使用するにはどうすればよいですか?

分類Dev

実行時にインプレースでクラスインスタンスの動作を変更するにはどうすればよいですか?

分類Dev

特定のクラスを起動するカスタムEclipse実行ランチャーを作成するにはどうすればよいですか?

分類Dev

Pythonで別のクラスから継承するクラスのコンストラクターを作成するにはどうすればよいですか?

分類Dev

このクラス内の最も内側のコンテンツを効率的に抽出するにはどうすればよいですか?

分類Dev

この `クラスデコレータ`を作成するにはどうすればよいですか?

分類Dev

Kotlinで、列挙型クラスがインターフェイスを実装するときに、継承された宣言の衝突を回避するにはどうすればよいですか?

分類Dev

Mavenインストールの実行時にライセンスチェックをスキップするにはどうすればよいですか?

Related 関連記事

  1. 1

    C ++では、クラスが継承チェーンの最後のクラス/子であるかどうかを確認するにはどうすればよいですか?つまり、基本クラスの反対側にあります

  2. 2

    クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

  3. 3

    親クラスに C++ のデフォルト コンストラクターがない場合、継承されたクラスでコンストラクターを使用するにはどうすればよいですか?

  4. 4

    デコレータを使用してクラスジェネリック型の実行時型を取得するにはどうすればよいですか?

  5. 5

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  6. 6

    継承チェーンの途中にクラスを挿入するにはどうすればよいですか?

  7. 7

    継承されるデータクラスにオプションのフィールドを作成するにはどうすればよいですか?

  8. 8

    継承チェーン内のすべてのクラスの属性を返すにはどうすればよいですか?

  9. 9

    プライベートコンストラクターを持つクラスがこのクラスからの継承を妨げないのはなぜですか?特定のベースから継承できるクラスを制御するにはどうすればよいですか?

  10. 10

    WebTestから継承するクラスのコードから実行設定->コンテキストパラメータにアクセスするにはどうすればよいですか?

  11. 11

    スタンドアロンクラスターの最後のタスクの実行時間を改善するにはどうすればよいですか?

  12. 12

    PHPのクラス継承で親メソッドのみを実行するにはどうすればよいですか?

  13. 13

    Collection <>を継承するクラス内のコレクションにアクセスするにはどうすればよいですか?

  14. 14

    別のファイルのクラス外のクラスコンストラクターを定義するにはどうすればよいですか?

  15. 15

    継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

  16. 16

    継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

  17. 17

    すでに実行中のインスタンスのJavaクラスのコードを変更するにはどうすればよいですか?

  18. 18

    コンパイル時にクラスが継承するものを変更するにはどうすればよいですか?

  19. 19

    データフレームの「範囲外のインデックス」エラーを修正するにはどうすればよいですか?

  20. 20

    継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

  21. 21

    内部デコレータクラスからクラスのインスタンスにアクセスするにはどうすればよいですか?

  22. 22

    抽象クラスから継承する文字列を使用して実行時にクラスの型を取得し、取得した型をパラメーターとして使用するにはどうすればよいですか?

  23. 23

    実行時にインプレースでクラスインスタンスの動作を変更するにはどうすればよいですか?

  24. 24

    特定のクラスを起動するカスタムEclipse実行ランチャーを作成するにはどうすればよいですか?

  25. 25

    Pythonで別のクラスから継承するクラスのコンストラクターを作成するにはどうすればよいですか?

  26. 26

    このクラス内の最も内側のコンテンツを効率的に抽出するにはどうすればよいですか?

  27. 27

    この `クラスデコレータ`を作成するにはどうすればよいですか?

  28. 28

    Kotlinで、列挙型クラスがインターフェイスを実装するときに、継承された宣言の衝突を回避するにはどうすればよいですか?

  29. 29

    Mavenインストールの実行時にライセンスチェックをスキップするにはどうすればよいですか?

ホットタグ

アーカイブ