型定義で`typeof T`したくなった時は {new ():T}

  • 6
    いいね
  • 0
    コメント

型定義でジェネリクスの型変数Tを使いつつ、インスタンス化する前のTそのもの1を定義するときのTIPS。

以前の記事で型クエリと組み合わせられたらなあ(typeof T)と書いていた。

同様に思う人は多かったらしく、いつの間にかTypeScriptの公式WIKIのFAQにやり方が書いてあった。
オブジェクトリテラル型の 型表現で {new ():T} とすればよい らしい。

function create<T>(ctor: { new(): T }) {
    return new ctor();
}
var c = create(MyClass); // c: MyClass

出典:Why can't I write typeof T, new T, or instanceof T in my generic function?

厳密にやるなら次のissueに紹介されていた方法もある。

/** Generic class type. */
type Constructor<T> = { new (...args: any[]): T } | ((...args: any[]) => T) | Function;

https://github.com/Microsoft/TypeScript/issues/204#issuecomment-257722306


  1. 何と呼べばいいのか。