É possível obter o nome da classe / tipo de um objeto em tempo de execução usando o TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
typescript
Adam Mills
fonte
fonte
Respostas:
Resposta simples:
No entanto: lembre-se de que o nome provavelmente será diferente ao usar código minificado.
fonte
let instance: any = this.constructor; console.log(instance.name);
any
éconsole.log(instance.constructor['name']);
interface Function { name: string; }
- isso estenderá a definição "nativa".MyClass.name
não funcionará bem se você estiver minificando seu código. Porque ele reduzirá o nome da classe.Sei que estou atrasado para a festa, mas acho que isso também funciona.
Alternativamente...
O código acima obtém todo o código do construtor como uma sequência e aplica uma expressão regular para obter todas as 'palavras'. A primeira palavra deve ser 'função' e a segunda palavra deve ser o nome da classe.
Espero que isto ajude.
fonte
Minha solução foi não confiar no nome da classe. object.constructor.name trabalha em teoria. Mas se você estiver usando o TypeScript em algo como o Ionic, assim que você começar a produção, ele ficará em chamas porque o modo de produção do Ionic reduz o código Javascript. Portanto, as classes recebem nomes como "a" e "e".
Acabei fazendo uma classe typeName em todos os meus objetos aos quais o construtor atribui o nome da classe. Assim:
Sim, não foi o que foi perguntado, realmente. Mas usar o constructor.name em algo que pode ser minificado no futuro é apenas implorar por uma dor de cabeça.
fonte
Veja esta pergunta .
Como o TypeScript é compilado para JavaScript, no tempo de execução, você está executando o JavaScript, portanto as mesmas regras serão aplicadas.
fonte
Você precisa converter primeiro a instância
any
porqueFunction
a definição de tipo não possui umaname
propriedade.Atualizar:
Com o TypeScript 2.4 (e potencialmente anterior), o código pode ser ainda mais limpo:
fonte
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.name
ou(this as object).constructor.name
é melhor do queany
porque, na verdade, você obtém o preenchimento automático :-)No Angular2, isso pode ajudar a obter o nome dos componentes:
comp: any é necessário porque a compilação do TypeScript emitirá erros, já que Function inicialmente não possui nome de propriedade.
fonte
element.nativeElement
- Em uma diretiva, você pode obter o nome do componente como este@Optional() element: ElementRef<HTMLElement>
e depois usáif (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
O código TypeScript completo
fonte
myClass.prototype.constructor.name
.myClass.constructor.name
:, tive o erro TypeScript:error TS2339: Property 'name' does not exist on type 'Function'
.fonte
Essa solução funciona após a uglificação da minificação, mas requer a decoração das classes com metadados.
Usamos a geração de código para decorar nossas classes de entidade com metadados da seguinte forma:
Em seguida, consuma com o seguinte auxiliar:
fonte
Se você já sabe quais tipos esperar (por exemplo, quando um método retorna um tipo de união ), pode usar protetores de tipo.
Por exemplo, para tipos primitivos, você pode usar um tipo de proteção :
Para tipos complexos, você pode usar uma instância de guarda :
fonte