Можно ли получить класс объекта/имя типа во время выполнения, используя TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
Можно ли получить класс объекта/имя типа во время выполнения, используя TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
class MyClass {}
const instance = new MyClass();
console.log(instance.constructor.name); // MyClass
console.log(MyClass.name); // MyClass
Однако: имейте в виду, что имя будет отличаться при использовании минимизированного кода.
Я знаю, что опаздываю на вечеринку, но я считаю, что это тоже работает.
var constructorString: string = this.constructor.toString();
var className: string = constructorString.match(/\w+/g)[1];
С другой стороны...
var className: string = this.constructor.toString().match(/\w+/g)[1];
Вышеприведенный код получает весь код конструктора в виде строки и применяет регулярное выражение для получения всех "слов". Первое слово должно быть "функцией", а второе слово должно быть именем класса.
Надеюсь, что это поможет.
Смотрите question.
Так как TypeScript скомпилирован в JavaScript, во время выполнения вы запускаете JavaScript, поэтому будут применяться те же правила.
Мое решение заключалось не в том, чтобы полагаться на имя класса. object.constructor.name работает в теории. Но если вы используете TypeScript в чем-то вроде Ionic, как только вы пойдете на производство, он будет расти в пламени, потому что режим ионного производства уменьшает код Javascript. Таким образом, классы получают названные вещи типа "a" и "e".
То, что я закончил, это иметь класс typeName во всех моих объектах, которому конструктор присваивает имя класса. Итак:
export class Person {
id: number;
name: string;
typeName: string;
constructor() {
typeName = "Person";
}
Да, это было не то, что было задано, действительно. Но использование constructor.name на том, что потенциально может быть уменьшено по дороге, - это просто выпрашивать головную боль.
Вам нужно сначала привести экземпляр к 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"
С 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"
В Angular2 это может помочь получить имя компонента:
getName() {
let comp:any = this.constructor;
return comp.name;
}
comp: any необходим, потому что typescript компиляция выдаст ошибки, поскольку функция изначально не имеет имени свойства.
Полный TypeScript код
public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
myClass.prototype.constructor.name.myClass.constructor.name, у меня была ошибка typescript: error TS2339: Property 'name' does not exist on type 'Function'.
Если вы уже знаете, какие типы ожидать (например, когда метод возвращает union type), тогда вы можете использовать типы охранников.
Например, для примитивных типов вы можете использовать typeof guard:
if (typeof thing === "number") {
// Do stuff
}
Для сложных типов вы можете использовать instanceof guard:
if (thing instanceof Array) {
// Do stuff
}
Просто делать
class TestClass {
getClassName() {
return this.constructor.name;
}
callMe(){
console.log(this.getClassName());
}
}