Promisifying a third-party JS library with minimal code overhead
You are correct that you can avoid a lot of the structure duplication in this class. A promisify function would help a lot. Node has a built in util.promisify. Alternatively, you could write a simple method to apply the arguments and resolve when called. In vanilla JS this is simple enough. 

function callPromised(method, ...args) {
    return new Promise((resolve, reject) =&gt; {
        method(...args, (error, result) =&gt; error ? reject(error) : resolve(result))
    })
}


Unfortunately, this method is difficult to type correctly in TypeScript. There's a proposal here. The best we can do now is write several overloads which gets incredibly messy with only a few parameters.

function callPromised&lt;TResult&gt;(method: (cb: Auth0Callback&lt;TResult&gt;) =&gt; void): Promise&lt;TResult&gt;;
function callPromised&lt;TResult, Arg1&gt;(method: (arg1: Arg1, cb: Auth0Callback&lt;TResult&gt;) =&gt; void, arg1: Arg1): Promise&lt;TResult&gt;;
function callPromised&lt;TResult, Arg1, Arg2&gt;(method: (arg1: Arg1, arg2: Arg2, cb: Auth0Callback&lt;TResult&gt;) =&gt; void, arg1: Arg1, arg2: Arg2): Promise&lt;TResult&gt;;
function callPromised(method: Function, ...args: any[]): Promise&lt;any&gt; {
    return new Promise((resolve, reject) =&gt; {
        method(...args, (error, result) =&gt; error ? reject(error) : resolve(result))
    })
}


The downside of this function is that this will not be bound correctly. This could be rectified by passing in a self parameter and would be required for your usage.

function callPromised&lt;TResult&gt;(method: (cb: Auth0Callback&lt;TResult&gt;) =&gt; void, self: any): Promise&lt;TResult&gt;;
function callPromised&lt;TResult, Arg1&gt;(method: (arg1: Arg1, cb: Auth0Callback&lt;TResult&gt;) =&gt; void, self: any, arg1: Arg1): Promise&lt;TResult&gt;;
function callPromised&lt;TResult, Arg1, Arg2&gt;(method: (arg1: Arg1, arg2: Arg2, cb: Auth0Callback&lt;TResult&gt;) =&gt; void, self: any, arg1: Arg1, arg2: Arg2): Promise&lt;TResult&gt;;
function callPromised(method: Function, self: any, ...args: any[]): Promise&lt;any&gt; {
    return new Promise((resolve, reject) =&gt; {
        method.call(self, ...args, (error, result) =&gt; error ? reject(error) : resolve(result))
    })
}

// For example
public loginWithDefaultDirectory(options: a0.DefaultDirectoryLoginOptions): Promise&lt;any&gt; {
    return callPromised(this.wa.loginWithDefaultDirectory, this.wa, options)
}