TypeScript クラス名取得方法
TypeScriptで実行時にオブジェクトのクラス名を取得する
TypeScriptでは、実行時にオブジェクトのクラス名を取得する方法がいくつかあります。ここでは、その方法について説明します。
constructor.nameプロパティを使用する
最も一般的な方法は、constructor.name
プロパティを使用することです。これは、クラスの名前を文字列として返します。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(john.constructor.name); // Output: "Person"
Object.prototype.toString()を使用する
Object.prototype.toString()
メソッドは、オブジェクトの型を表す文字列を返します。この文字列は、通常、[object Object]
のような形式ですが、クラスを定義している場合は、クラスの名前が含まれます。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(Object.prototype.toString.call(john)); // Output: "[object Person]"
typeof演算子を使用する
typeof
演算子は、オペランドの型を文字列として返します。ただし、typeof
演算子はクラスの具体的な名前を返すことはできません。代わりに、object
という文字列を返します。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(typeof john); // Output: "object"
注意
typeof
演算子は、クラスの具体的な名前を返すことはできません。Object.prototype.toString()
メソッドは、カスタムプロトタイプチェーンを使用している場合、正確なクラス名を返さない場合があります。constructor.name
プロパティは、クラスが定義されている方法によっては、正確なクラス名を返さない場合があります。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(john.constructor.name); // Output: "Person"
- 解説
Person
クラスを定義します。john
という名前のPerson
オブジェクトを作成します。john.constructor.name
で、john
オブジェクトのコンストラクタの名称を取得します。この場合、Person
が返されます。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(Object.prototype.toString.call(john)); // Output: "[object Person]"
- 解説
Object.prototype.toString()
メソッドは、オブジェクトの型を表す文字列を返します。call
メソッドを使用して、john
オブジェクトのコンテキストでtoString()
メソッドを呼び出します。- 返される文字列は、
[object Person]
のような形式で、クラスの名前が含まれます。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
console.log(typeof john); // Output: "object"
- 解説
typeof
演算子は、オペランドの型を文字列として返します。john
オブジェクトの型はobject
なので、typeof john
はobject
を返します。- この方法では、クラスの具体的な名前を取得することはできません。
instanceof演算子を使用する
instanceof
演算子は、オブジェクトが特定のクラスのインスタンスであるかどうかを判定します。ただし、クラスの名前を取得することはできません。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
if (john instanceof Person) {
console.log("john is an instance of Person");
} else {
console.log("john is not an instance of Person");
}
Reflect.getPrototypeOf()を使用する
Reflect.getPrototypeOf()
メソッドは、オブジェクトのプロトタイプオブジェクトを取得します。プロトタイプオブジェクトのコンストラクタの名称を調べることで、クラス名を推測することができます。ただし、プロトタイプチェーンが複雑な場合、正確なクラス名を取得できないことがあります。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
const john = new Person("John");
const prototype = Reflect.getPrototypeOf(john);
console.log(prototype.constructor.name); // Output: "Person"
カスタムプロパティを使用する
クラスにカスタムプロパティを追加し、クラス名を格納することができます。
class Person {
name: string;
className: string;
constructor(name: string) {
this.name = name;
this.className = "Person";
}
}
const john = new Person("John");
console.log(john.className); // Output: "Person"
- カスタムプロパティを使用する方法は、クラスの設計に影響を与える可能性があります。
Reflect.getPrototypeOf()
メソッドは、プロトタイプチェーンが複雑な場合、正確なクラス名を取得できないことがあります。instanceof
演算子は、クラスの名前を取得することはできません。
typescript