title: Using a method decorator to change the function return type
body: <p>Below I have a sync function that returns a boolean, I am using this decorator <code>@MakeAsync</code> to change the function. I am curious how I can update the return type of the function after this change has been made. I tried using <code>Promise&lt;ReturnType&lt;typeof original&gt;&gt;</code>, but that failed.</p>
  
  <p>Is it possible for a decorator to overwrite the type definition (parameters, and return type) of a method?</p>
  
  <pre><code>function MakeAsync() {
      console.log("f(): evaluated");
      return function (target, key: string, descriptor: PropertyDescriptor) {
          const original = descriptor.value;
          if (typeof original === 'function') {
              descriptor.value = async (...args): Promise&lt;ReturnType&lt;typeof original&gt;&gt; =&gt; {
                  return original(...args)
              }
          }
          return descriptor;
      }
  }
  
  class Example {    
      @MakeAsync()
      doTrue (): Boolean {
          return true
      }
  }
  
  const e = new Example
  
  console.log(e.doTrue())
  </code></pre>