【保存版】TypeScriptでジェネリッククラスをもっと使いこなす!名前取得をはじめとした便利テクニック集
TypeScriptにおけるジェネリッククラスの名前の取得方法
しかし、いくつかの方法で、ジェネリッククラスに関連する情報を取得することはできます。以下、代表的な方法をご紹介します。
型パラメータの取得
typeof
演算子を使用して、ジェネリッククラスに渡された型パラメータの型情報を得ることができます。ただし、これはクラスの名前ではなく、型情報のみであることに注意してください。
function getTypeName<T>(instance: T): string {
return typeof instance;
}
class MyGenericClass<T> {
constructor(private value: T) {}
getName(): string {
return getTypeName(this.value); // "T" と出力される
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "Hello" と出力される
コンストラクタの引数型から推測
ジェネリッククラスのコンストラクタの引数型から、クラスの名前を推測する方法もあります。ただし、これはあくまでも推測であり、常に正確とは限りません。
function getClassName<T>(constructor: { new(): T }): string {
const constructorString = constructor.toString();
const match = constructorString.match(/class\s+([^\s{]+)/);
if (match) {
return match[1];
} else {
return "";
}
}
class MyGenericClass<T> {
constructor(private value: T) {}
getName(): string {
return getClassName(MyGenericClass); // "MyGenericClass" と出力される
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "Hello" と出力される
シンボルを使用
class MyGenericClass<T> {
private static readonly _name = Symbol();
constructor(private value: T) {}
static get name(): symbol {
return this._name;
}
getName(): string {
return (this.constructor as typeof MyGenericClass<T>).name; // "MyGenericClass" と出力される
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "Hello" と出力される
function getTypeName<T>(instance: T): string {
return typeof instance;
}
class MyGenericClass<T> {
constructor(private value: T) {}
getName(): string {
return getTypeName(this.value);
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "string" と出力される
function getClassName<T>(constructor: { new(): T }): string {
const constructorString = constructor.toString();
const match = constructorString.match(/class\s+([^\s{]+)/);
if (match) {
return match[1];
} else {
return "";
}
}
class MyGenericClass<T> {
constructor(private value: T) {}
getName(): string {
return getClassName(MyGenericClass);
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "MyGenericClass" と出力される
class MyGenericClass<T> {
private static readonly _name = Symbol();
constructor(private value: T) {}
static get name(): symbol {
return this._name;
}
getName(): string {
return (this.constructor as typeof MyGenericClass<T>).name;
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "MyGenericClass" と出力される
説明
- クラスの名前を推測する必要がある場合は、2番目の方法が有効です。
- 型パラメータの型情報のみが必要であれば、1番目の方法が最もシンプルです。
- どの方法を使用するかは、状況によって異なります。
- 上記のコードは、それぞれ異なる方法でジェネリッククラスの名前を取得しています。
- TypeScriptに関する詳細は、公式ドキュメントを参照してください。
ジェネリッククラスは、__extends
プロパティを使用して、継承しているクラスの情報にアクセスできます。このプロパティから、継承元のクラスの名前を取得することができます。ただし、この方法は、ジェネリッククラスが直接別のクラスを継承している場合にのみ有効です。
class BaseClass {}
class MyGenericClass<T> extends BaseClass {
constructor(private value: T) {}
getName(): string {
return (this.__extends as any).name; // "BaseClass" と出力される
}
}
const myInstance = new MyGenericClass("Hello");
console.log(myInstance.getName()); // "Hello" と出力される
デバッガを使用
ブラウザのデバッガツールを使用すると、実行中のJavaScriptオブジェクトのプロパティを検査することができます。これにより、ジェネリッククラスの name
プロパティを確認することもできます。ただし、この方法は、デバッガツールの使用方法に慣れている場合にのみ有効です。
ライブラリを使用
ts-extensible
のようなライブラリを使用すると、ジェネリッククラスに関するより多くの情報にアクセスできます。これらのライブラリは、name
プロパティを含む、ジェネリッククラスの詳細な情報を提供する可能性があります。
typescript