Se la funzione in questione è un metodo di una classe definita dall'utente, è possibile utilizzare decoratori di metodi in combinazione con Reflect Metadata per determinare il tipo di ritorno (funzione di costruzione) in fase di esecuzione (e con esso, fare come meglio credi).
Ad esempio, potresti registrarlo sulla console:
function logReturnType(
target: Object | Function,
key: string,
descriptor: PropertyDescriptor
): PropertyDescriptor | void {
var returnType = Reflect.getMetadata("design:returntype", target, key);
console.log(returnType);
}
Basta agganciare questo decoratore di metodo su un metodo di tua scelta e avrai il riferimento esatto alla funzione di costruzione dell'oggetto che viene presumibilmente restituito dalla chiamata al metodo.
class TestClass {
@logReturnType
public test(): number {
return 42;
}
}
Tuttavia, ci sono alcune limitazioni notevoli a questo approccio:
- devi definire esplicitamente il tipo di ritorno su un metodo decorato come tale, altrimenti verrai indefinito da
Reflect.getMetadata
,
- puoi fare riferimento solo a tipi effettivi che esistono anche dopo la compilazione; cioè niente interfacce o generici
Inoltre, dovrai specificare i seguenti argomenti della riga di comando per il compilatore dattiloscritto, perché sia i decoratori che i metadati di riflessione sono funzionalità sperimentali al momento della stesura di questo post:
--emitDecoratorMetadata --experimentalDecorators