Eu utilizei outra solução que considerei boa também, e queria compartilhar. Simplesmente subscrevi o getter pelo próprio elemento:
function domInjector(seletor: string) {
return function(target: any, propertyKey: string) {
const getter = function() {
const elemento = document.querySelector(seletor) as HTMLElement;
if(!elemento) {
throw new Error(`${propertyKey} queria receber elemento de selector ${seletor}, que não foi encontrado`);
}
Object.defineProperty(this, propertyKey,
{ value: elemento
});
return elemento;
}
Object.defineProperty(target, propertyKey, {
get: getter
});
}
}