Czy można uzyskać nazwę klasy / typu obiektu w czasie wykonywania przy użyciu TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
typescript
Adam Mills
źródło
źródło
Odpowiedzi:
Prosta odpowiedź:
Należy jednak pamiętać, że nazwa będzie prawdopodobnie inna przy użyciu kodu zminimalizowanego.
źródło
let instance: any = this.constructor; console.log(instance.name);
any
jestconsole.log(instance.constructor['name']);
interface Function { name: string; }
- spowoduje to rozszerzenie definicji „natywnej”.MyClass.name
nie będzie działać dobrze, jeśli minimalizujesz swój kod. Ponieważ zminimalizuje nazwę klasy.Wiem, że jestem spóźniony na imprezę, ale stwierdzam, że to też działa.
Alternatywnie...
Powyższy kod pobiera cały kod konstruktora jako ciąg znaków i stosuje wyrażenie regularne, aby uzyskać wszystkie „słowa”. Pierwszym słowem powinna być „funkcja”, a drugim słowem powinna być nazwa klasy.
Mam nadzieję że to pomoże.
źródło
Moim rozwiązaniem nie było poleganie na nazwie klasy. object.constructor.name działa w teorii. Ale jeśli używasz TypeScript w czymś takim, jak Ionic, jak tylko przejdziesz do produkcji, stanie się płomieniem, ponieważ tryb produkcji Ionic minimalizuje kod JavaScript. Tak więc klasy otrzymują nazwy takie jak „a” i „e”.
Skończyło się na tym, że we wszystkich moich obiektach posiadałem klasę typeName, do której konstruktor przypisuje nazwę klasy. Więc:
Tak, naprawdę nie o to pytano. Ale użycie konstruktora.nazwa na czymś, co może potencjalnie zostać zminimalizowane na drodze, błaga o ból głowy.
źródło
Zobacz to pytanie .
Ponieważ TypeScript jest kompilowany do JavaScript, w czasie wykonywania używasz JavaScript, więc obowiązują te same reguły.
źródło
Najpierw musisz rzutować instancję,
any
ponieważFunction
definicja typu nie maname
właściwości.Aktualizacja:
W TypeScript 2.4 (i potencjalnie wcześniej) kod może być jeszcze czystszy:
źródło
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.name
lub(this as object).constructor.name
jest lepszy niżany
dlatego, że faktycznie dostajesz autouzupełnianie :-)W Angular2 może to pomóc uzyskać nazwę komponentów:
comp: każdy jest potrzebny, ponieważ kompilacja TypeScript będzie powodować błędy, ponieważ funkcja początkowo nie ma nazwy właściwości.
źródło
element.nativeElement
- zgodnie z dyrektywą możesz uzyskać nazwę komponentu w ten sposób,@Optional() element: ElementRef<HTMLElement>
a następnie użyćif (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
Pełny kod TypeScript
źródło
myClass.prototype.constructor.name
.myClass.constructor.name
miałem błąd TypeScript:error TS2339: Property 'name' does not exist on type 'Function'
.źródło
To rozwiązanie działa po zmglifikacji minimalizacji, ale wymaga udekorowania klas metadanymi.
Używamy generowania kodu, aby udekorować nasze klasy jednostek za pomocą takich metadanych:
Następnie skonsultuj się z następującym pomocnikiem:
źródło
Jeśli już wiesz, jakich typów się spodziewać (na przykład, gdy metoda zwraca typ unii ), możesz użyć strażników typów.
Na przykład, dla typów pierwotnych możesz użyć wartownika typeof :
W przypadku typów złożonych możesz użyć instancji ochrony :
źródło