0Pricing
TypeScript Academy · レッスン

デコレーターのメタデータ

metadata APIでメタデータを付与し、読み取ります。

「デコレーターのメタデータ」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

デコレーターのメタデータAPI

標準化されたデコレーターには、組み込みのメタデータ経路が含まれています。コンテキストオブジェクトが公開する metadata オブジェクトに書き込むと、クラスは後から既知の Symbol.metadata キーの下にそのメタデータを保持します。

context.metadata

すべてのデコレーターコンテキストは、定義中のクラスに対して1つの metadata オブジェクトを共有します。デコレーターはこのオブジェクトにデータを追加し、それがクラスのメタデータになります。

function tag(label: string) {
  return function (value: any, context: DecoratorContext) {
    context.metadata[context.name] = label;
  };
}

Symbol.metadata による読み取り

クラスの定義が完了すると、収集されたメタデータを SomeClass[Symbol.metadata] から利用できます。

class User {
  @tag("identifier") id = 0;
  @tag("display")    name = "";
}

const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }

オブジェクトを共有する理由

クラス上のすべてのデコレーターが同じ metadata オブジェクトに書き込むため、多数のデコレーターから得た情報を1つのまとまったレコードに集約し、クラスを記述できます。

構造化されたメタデータの保存

メタデータの値はどのような形でも構いません。よくあるパターンは、メンバー名をキーにしたネストされたレコードを保持することです。

function column(type: string) {
  return function (value: any, context: ClassFieldDecoratorContext) {
    const md = context.metadata as any;
    md.columns ??= {};
    md.columns[context.name] = { type };
  };
}

クラスレベルのメタデータ

クラスデコレーターからメタデータを書き込むこともできます。たとえば、フィールドごとのカラム情報を補完するテーブル名などです。

function entity(table: string) {
  return function (value: Function, context: ClassDecoratorContext) {
    (context.metadata as any).table = table;
  };
}

@entity("users")
class UserEntity {
  @column("serial") id = 0;
  @column("text")   name = "";
}

メタデータの継承

メタデータオブジェクトはプロトタイプチェーンに沿って関連付けられます。サブクラスのメタデータオブジェクトは親のメタデータをプロトタイプに持つため、上書きされない限り継承されたエントリも参照できます。

Symbol.metadata のポリフィル

Symbol.metadata は well-known symbol です。これを持たない環境では、ランタイムが収集されたオブジェクトを関連付けられるようにポリフィルを割り当てます。

(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");

reflect-metadata を使わないメタデータ

この API はデコレーター提案自体の一部であるため、別個の reflect-metadata ライブラリは必要ありません。このライブラリが引き続き関係するのは、以前の実験的な design-type の出力だけです(次のレッスンで扱います)。

実用的な読み取りヘルパー

小さなアクセサーに任意のクラスからメタデータを読み取る処理を集約すると、メタデータが存在しない場合に空のオブジェクトを返せます。

function getMeta(cls: any): Record<string, any> {
  return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}

重要な理由

メタデータによって、デコレーターは単発の動作ラッパーから、クラスの宣言的な記述へと変わります。フレームワークはこの記述を読み取り、ランタイムリフレクションのハックに頼らずに ORM、バリデーター、ルーターを構築します。

理解度チェック

メタデータ API の理解度を確認しましょう。

まとめ

デコレーターのメタデータ APIは、すべてのデコレーターに共有の context.metadata オブジェクトを提供し、それを Symbol.metadata を通じてクラス上に公開します。デコレーターは外部ライブラリなしで、構造化された継承可能なメタデータを集約できます。これにより、宣言的でフレームワークと親和性の高いクラス記述が可能になります。

よくある質問

「デコレーターのメタデータ」レッスンは無料ですか?

はい。「デコレーターのメタデータ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「デコレーターのメタデータ」で何を学びますか?

metadata APIでメタデータを付与し、読み取ります。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「デコレーターのメタデータ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Stage 3デコレーターの解説
  2. デコレーターのメタデータ
  3. reflect-metadataとDesign Types
  4. デコレーターフレームワークの構築
← TypeScript Academyに戻る