Получить имя класса объекта во время выполнения

Можно ли получить класс объекта/имя типа во время выполнения, используя TypeScript?

class MyClass{}

var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"

Ответ 1

Простой ответ:

class MyClass {}

const instance = new MyClass();

console.log(instance.constructor.name); // MyClass
console.log(MyClass.name);              // MyClass

Однако: имейте в виду, что имя будет отличаться при использовании минимизированного кода.

Ответ 2

Я знаю, что опаздываю на вечеринку, но я считаю, что это тоже работает.

var constructorString: string = this.constructor.toString();
var className: string = constructorString.match(/\w+/g)[1]; 

С другой стороны...

var className: string = this.constructor.toString().match(/\w+/g)[1];

Вышеприведенный код получает весь код конструктора в виде строки и применяет регулярное выражение для получения всех "слов". Первое слово должно быть "функцией", а второе слово должно быть именем класса.

Надеюсь, что это поможет.

Ответ 3

Смотрите question.

Так как TypeScript скомпилирован в JavaScript, во время выполнения вы запускаете JavaScript, поэтому будут применяться те же правила.

Ответ 4

Мое решение заключалось не в том, чтобы полагаться на имя класса. object.constructor.name работает в теории. Но если вы используете TypeScript в чем-то вроде Ionic, как только вы пойдете на производство, он будет расти в пламени, потому что режим ионного производства уменьшает код Javascript. Таким образом, классы получают названные вещи типа "a" и "e".

То, что я закончил, это иметь класс typeName во всех моих объектах, которому конструктор присваивает имя класса. Итак:

export class Person {
id: number;
name: string;
typeName: string;

constructor() {
typeName = "Person";
}

Да, это было не то, что было задано, действительно. Но использование constructor.name на том, что потенциально может быть уменьшено по дороге, - это просто выпрашивать головную боль.

Ответ 5

Вам нужно сначала привести экземпляр к any, потому что определение типа Function не имеет свойства name.

class MyClass {
  getName() {
    return (<any>this).constructor.name;
    // OR return (this as any).constructor.name;
  }
}

// From outside the class:
var className = (<any>new MyClass()).constructor.name;
// OR var className = (new MyClass() as any).constructor.name;
console.log(className); // Should output "MyClass"

// From inside the class:
var instance = new MyClass();
console.log(instance.getName()); // Should output "MyClass"

Update:

С TypeScript 2.4 (и, возможно, раньше) код может быть еще более чистым:

class MyClass {
  getName() {
    return this.constructor.name;
  }
}

// From outside the class:
var className = (new MyClass).constructor.name;
console.log(className); // Should output "MyClass"

// From inside the class:
var instance = new MyClass();
console.log(instance.getName()); // Should output "MyClass"

Ответ 6

В Angular2 это может помочь получить имя компонента:

    getName() {
        let comp:any = this.constructor;
        return comp.name;
    }

comp: any необходим, потому что typescript компиляция выдаст ошибки, поскольку функция изначально не имеет имени свойства.

Ответ 7

Полный TypeScript код

public getClassName() {
    var funcNameRegex = /function (.{1,})\(/;
    var results  = (funcNameRegex).exec(this["constructor"].toString());
    return (results && results.length > 1) ? results[1] : "";
}

Ответ 8

  • Нужно было добавить "прототип .": myClass.prototype.constructor.name.
  • В противном случае со следующим кодом: myClass.constructor.name, у меня была ошибка typescript:

error TS2339: Property 'name' does not exist on type 'Function'.

Ответ 9

Если вы уже знаете, какие типы ожидать (например, когда метод возвращает union type), тогда вы можете использовать типы охранников.

Например, для примитивных типов вы можете использовать typeof guard:

if (typeof thing === "number") {
  // Do stuff
}

Для сложных типов вы можете использовать instanceof guard:

if (thing instanceof Array) {
  // Do stuff
}

Ответ 10

Просто делать

class TestClass {
  getClassName() {
    return this.constructor.name;
  }
   callMe(){
    console.log(this.getClassName());
   }
}