typescriptクラスデコレータ:コンストラクタをオーバーライドしますが、クラス名は保持しますか?

ブラウン

タイプスクリプトハンドブックには、クラスデコレータを使用してコンストラクタをオーバーライドする方法の例があります(リンク)。

function classDecorator<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  return class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
}

@classDecorator
class Greeter {
  property = "property";
  hello: string;
  constructor(m: string) {
    this.hello = m;
  }
}

結果のクラスのインスタンスをログアウトすると、クラス名が見つかりません。

console.log(new Greeter("world"));
//=> { "property": "property", "hello": "override", "newProperty": "new property" }

ここで、デコレータを変更して新しいクラスを変数に割り当てると、ログにはその変数の名前が含まれます。

function classDecorator2<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  const MyDecoratedClass = class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
  return MyDecoratedClass
}


@classDecorator2
class Greeter2 {
  // ... same as Greeter
}


console.log(new Greeter2("world"));
//=> MyDecoratedClass: { "property": "property", "hello": "override", "newProperty": "new property" } 

コンソール出力でクラスの元の名前を保持する方法はありますか?たとえば、最後のコンソールステートメントの出力を

Greeter2: { "property": "property", "hello": "override", "newProperty": "new property" }

ここのtypescriptサンドボックス利用可能なすべてのコードサンプル

エヴァン・トリンボリ

あなたはこのようなことを試すことができますが、少しハッキーなようです。

function classDecorator<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  const cls = class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
  Object.defineProperty(cls, 'name', {
    get: () => `${constructor.name}Generated`
  });
  return cls
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C#は基本クラスのコレクションタイプをオーバーライドします

分類Dev

Java-外部クラスからジェネリックスを継承する内部クラスをオーバーライドすると、「名前の衝突」および「コンストラクターが未定義」エラーが発生します

分類Dev

クラスをオーバーロードするコンストラクターがDLLを使用してリンカーエラーを取得しますか?

分類Dev

Groovyクラスがコンストラクターをオーバーライドしましたが、なぜMissingMethodExceptionなのですか?

分類Dev

TypeScriptコンストラクターのオーバーロードは異なる型を返します

分類Dev

クラスのデコレータは、インポート時にクラスをNoneTypeにします

分類Dev

コンストラクターのオーバーロード時にコードを再利用しますか?

分類Dev

Mooのコンストラクターをオーバーライドする方法はありますか?

分類Dev

クラスから派生型を作成しますが、コンストラクター(typescript)を省略します

分類Dev

クラスから派生型を作成しますが、コンストラクター(typescript)を省略します

分類Dev

クラスコンストラクターからのオブジェクトのコレクションをインスタンス化します

分類Dev

LinkedHashSetコンストラクターは順序を保持しますか

分類Dev

ライブラリーのレタスコアのクライアントレタスはどこにデータを保存しますか?

分類Dev

方法:適切なデフォルトコンストラクタなしでクラスのインスタンスをコピーする。デフォルトのコンストラクターのないメンバーがありますか?

分類Dev

コピーコンストラクタは、リンクリストをトラバースします。実装

分類Dev

yii2はデータベースクラスからbatchinsertをオーバーライドします

分類Dev

Constコンストラクターは非constクラスオブジェクトを作成しますか?

分類Dev

MYSQLコマンドラインクライアントを使用してデータベースをエクスポートする方法はありますか?

分類Dev

コンストラクターで呼び出されたメソッドをオーバーライドすると、Groovy metaClassが失敗しますか?

分類Dev

UIButtonクラスのデフォルトコンストラクターのオーバーライドに問題がありますか?

分類Dev

コンストラクターの名前を取得します

分類Dev

コンストラクターまたは宣言でクラスフィールドを初期化しますか?

分類Dev

オーバーロードされたコンストラクターをスタブしようとすると、NSubstituteがクラッシュします

分類Dev

Typescript-抽象メソッドから子クラスのコンストラクターを返します

分類Dev

C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

分類Dev

データコンテキスト内のコンボボックスをクラスの第1レベルのリストにバインドします

分類Dev

派生クラスのデストラクタを仮想/オーバーライドとしてマークする必要がありますか?

分類Dev

コピーコンストラクターはファイルメンバーを再初期化しますか

分類Dev

C ++:ライブラリを2回リンクしますが、グローバルコンストラクターは2回実行されますか?

Related 関連記事

  1. 1

    C#は基本クラスのコレクションタイプをオーバーライドします

  2. 2

    Java-外部クラスからジェネリックスを継承する内部クラスをオーバーライドすると、「名前の衝突」および「コンストラクターが未定義」エラーが発生します

  3. 3

    クラスをオーバーロードするコンストラクターがDLLを使用してリンカーエラーを取得しますか?

  4. 4

    Groovyクラスがコンストラクターをオーバーライドしましたが、なぜMissingMethodExceptionなのですか?

  5. 5

    TypeScriptコンストラクターのオーバーロードは異なる型を返します

  6. 6

    クラスのデコレータは、インポート時にクラスをNoneTypeにします

  7. 7

    コンストラクターのオーバーロード時にコードを再利用しますか?

  8. 8

    Mooのコンストラクターをオーバーライドする方法はありますか?

  9. 9

    クラスから派生型を作成しますが、コンストラクター(typescript)を省略します

  10. 10

    クラスから派生型を作成しますが、コンストラクター(typescript)を省略します

  11. 11

    クラスコンストラクターからのオブジェクトのコレクションをインスタンス化します

  12. 12

    LinkedHashSetコンストラクターは順序を保持しますか

  13. 13

    ライブラリーのレタスコアのクライアントレタスはどこにデータを保存しますか?

  14. 14

    方法:適切なデフォルトコンストラクタなしでクラスのインスタンスをコピーする。デフォルトのコンストラクターのないメンバーがありますか?

  15. 15

    コピーコンストラクタは、リンクリストをトラバースします。実装

  16. 16

    yii2はデータベースクラスからbatchinsertをオーバーライドします

  17. 17

    Constコンストラクターは非constクラスオブジェクトを作成しますか?

  18. 18

    MYSQLコマンドラインクライアントを使用してデータベースをエクスポートする方法はありますか?

  19. 19

    コンストラクターで呼び出されたメソッドをオーバーライドすると、Groovy metaClassが失敗しますか?

  20. 20

    UIButtonクラスのデフォルトコンストラクターのオーバーライドに問題がありますか?

  21. 21

    コンストラクターの名前を取得します

  22. 22

    コンストラクターまたは宣言でクラスフィールドを初期化しますか?

  23. 23

    オーバーロードされたコンストラクターをスタブしようとすると、NSubstituteがクラッシュします

  24. 24

    Typescript-抽象メソッドから子クラスのコンストラクターを返します

  25. 25

    C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

  26. 26

    データコンテキスト内のコンボボックスをクラスの第1レベルのリストにバインドします

  27. 27

    派生クラスのデストラクタを仮想/オーバーライドとしてマークする必要がありますか?

  28. 28

    コピーコンストラクターはファイルメンバーを再初期化しますか

  29. 29

    C ++:ライブラリを2回リンクしますが、グローバルコンストラクターは2回実行されますか?

ホットタグ

アーカイブ