Como obter o nome da classe genérica<T> no TypeScript?
Minha classe genérica
export class BaseService<T> {
public subUrl;
constructor(public repo:RepogitoryService) { }
}
Como posso armazenar o nome da classe de T em uma variável local?
Resposta #1
Você deve entender que o Typescript é apenas um transpiler (compilador para javascript). Alguns dos açúcares de sintaxe (como generics) funcionam apenas na fase de verificação de tipos (e também são úteis para intellisense no seu IDE/editor de texto).
No entanto, a atribuição a uma variável acontece em tempo de execução, em tempo de execução é apenas um Javascript comum. Não há tipos nem genéricos em tempo de execução.
Mas aqui está a maneira mais fácil que eu faria:
class Some<T> {
private TName : string;
constructor(x : T&Function) {
this.TName = x.name;
}
}
class Another {
}
const some = new Some<Another>(Another);
Resposta #2
O workaround durisvk10 cobre o assunto, só quero acrescentar que eu preferiria usar
x: new() => T do que x: T&Function.
Como isto:
...
constructor(x : new () => T) {
this.TName = x.name;
}
...
Resposta #3
Você não pode, infelizmente. TypeScript é um verificador de tipos estático e não tem suporte para reflexão de tipos em tempo de execução como o Java. Isso ocorre porque seus códigos-fonte são transpilados para JavaScript.
No entanto, há esperança para tal suporte no futuro, com um novo recurso do TypeScript chamado "transformadores personalizados". Esses transformadores são plugins que se conectam ao processo de transpiração, abrindo caminho para recursos avançados relacionados à reflexão de tipos. Um primeiro exemplo disso é ts-transformer-keys.
