Video playback loop using promise chaining and setTimeout
You could try something like this:
export class LoopStep {
    public onStart(): Promise&lt;void&gt; { // entry point
        return this.onLoop();
    }

    private onLoop(): Promise&lt;void&gt; {
        return this.loopAndResolve();
    }

    private loopAndResolve(): Promise&lt;void&gt; { // start loop
        if (this.isLooping) { // exit condition when turned to false
            this.player.setTime(this.start);
            this.player.play();
            setTimeout(() =&gt; this.loopAndResolve(), this.duration * 1000);
        } else {
            return Promise.resolve();
        }
    }
}

// Anywhere else
loopsStep.onStart().then(() =&gt; console.log('exiting loop successfully')); // OK

One of the best things of Typescript is the type safety. It's easier to keep track of the promises you're passing from one function to another if you declare them in the return type.
In your case, where you just want a cleaner way to resolve a Promise, you can use Promise.resolve();. It's pretty straightforward to use and very useful. DOCS
(Don't forget the parenthesis when calling onStart!)