Jeśli dana funkcja jest metodą klasy zdefiniowanej przez użytkownika, możesz użyć dekoratorów metod w połączeniu z Reflect Metadata w celu określenia typu zwracanego (funkcji konstruktora) w czasie wykonywania (a wraz z nią rób, co chcesz).
Na przykład możesz zalogować się do konsoli:
function logReturnType(
target: Object | Function,
key: string,
descriptor: PropertyDescriptor
): PropertyDescriptor | void {
var returnType = Reflect.getMetadata("design:returntype", target, key);
console.log(returnType);
}
Po prostu przyciągnij dekorator metody do wybranej metody, a otrzymasz dokładne odniesienie do funkcji konstruktora obiektu, która rzekomo została zwrócona przez wywołanie metody.
class TestClass {
@logReturnType
public test(): number {
return 42;
}
}
Istnieje jednak kilka godnych uwagi ograniczeń tego podejścia:
- musisz jawnie zdefiniować typ zwracany w metodzie udekorowanej jako taka, w przeciwnym razie otrzymasz undefined z
Reflect.getMetadata,
- możesz odwoływać się tylko do rzeczywistych typów, które również istnieją po kompilacji; to znaczy nie ma interfejsów ani typów ogólnych
Będziesz także musiał określić następujące argumenty wiersza poleceń dla kompilatora maszynopisu, ponieważ zarówno dekoratory, jak i metadane odzwierciedlające są funkcjami eksperymentalnymi w momencie pisania tego postu:
--emitDecoratorMetadata --experimentalDecorators