new () => T 構築シグネチャ
最終更新:2026-10-22
new () => T 構築シグネチャ
構築シグネチャ new (name: string) => T は「この値は new して T を作れる」と記述します。クラスそのもの(インスタンスではなく)を引数として渡すときに必要になります。ファクトリ関数、依存性注入、プラグインシステムはいずれもこの型で「ものを作る能力」を抽象しています。
| グループ | 関数とクラス |
|---|---|
| 種類 | 構文 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
class Player {
constructor(public name: string, public hp = 100) {}
}
type PlayerCtor = new (name: string, hp?: number) => Player;
function spawn(Ctor: PlayerCtor, name: string, hp?: number): Player {
return new Ctor(name, hp);
}
⚙️ パラメータ
| new | 構築シグネチャの接頭辞:このシグネチャは普通の呼び出しではなく new で呼び出されることを示します |
|---|---|
| (name: string, hp?: number) | 構築パラメータ:クラスのコンストラクタのパラメータと位置ごとに対応します |
| => Player | 構築物の型:new 式の結果の型 |
戻り値:new 式の結果の型、つまり構築シグネチャの => の右側の型です。ファクトリ関数は通常これをそのまま自分の戻り値型として透過します。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
Ada hp=100, Ben hp=80
(トランスパイル後の実行出力。コンストラクタの引数が合わないクラスを spawn に渡すとコンパイル時にエラーになります)
💡 ポイント
ℹ️ 説明 クラスそのものがその構築シグネチャの「値」です。spawn に渡すのは Player クラスへの参照であり、new はファクトリ内部で行われます——これが「クラスは第一級の値である」ことの型レベルでの表現です。
💡 ヒント ジェネリックファクトリ new (...args: any[]) => T は依存性注入の最小限の型です。任意のクラスを渡して T のインスタンスを得ます。正確なコンストラクタパラメータ型を保持したい場合は InstanceType<typeof C> を使います。
⚠️ 注意 抽象クラスは具体的な構築シグネチャを満たしません(直接 new できないため)。「クラスまたはそのサブクラス」を表すには抽象構築シグネチャ abstract new (...) => T を使います。
🏷️ 関連関数とクラス
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q 構築シグネチャと InstanceType<typeof Player> の違いは何ですか?
A typeof Player は「クラスそのもの」の型で、静的メンバーと正確なコンストラクタ引数を備えます。new (...) => T は「new して T を作れる」ことだけを約束する、より抽象的な型です。正確さが要れば前者、汎用ファクトリなら後者です。
Q どんな場面で構築シグネチャが必須になりますか?
A 「クラス」を値として関数に渡すときすべてです。spawn(PlayerCtor, name)、コンテナへの new StorageClass() の登録、プラグインシステムの new Plugin() の読み込みなど。普通のインターフェースはインスタンスを記述できるだけで、クラスそのものは記述できません。
Q ジェネリックファクトリを汎用かつ型安全に書くには?
A function create<T>(Ctor: new (...args: any[]) => T, ...args: any[]): T { return new Ctor(...args); } ——入力を寛容にして汎用性を得つつ、戻り値は正確な T のまま保ちます。