first of all, Welcome to StackOverflow
Your code works fine, but remember that you are using setTimout, so even if you call stopInterval(), the code inside the timeout will fire once more 
to prevent it, you could do this
- start the interval with 0
- when clearInterval()set the interval to0once again
- now, inside the setTimeoutfunction, only run the code ifinterval > 0
does it makes sense?
here's a simple example in JsBIN and well with StackOverflow Code:
var pre = document.querySelector("pre")
var interval = 0;
function startInterval() {
  pre.innerHTML += 'START called\n';
  interval = setInterval(function() {
    pre.innerHTML += 'type code\n';
    setTimeout(function() {
      if (interval > 0 ) {
        // only if the interval is not cleared
        pre.innerHTML += 'other code\n';
      }
    }, 1000);
    
  }, 2000);
}
function stopInterval() {
  pre.innerHTML += 'STOP called\n';
  clearInterval(interval);
  interval = 0;
}
document
  .querySelector("#btnStart")
  .addEventListener("click", startInterval);
document
  .querySelector("#btnStop")
  .addEventListener("click", stopInterval);
<button id="btnStart">START</button> <button id="btnStop">STOP</button>
<hr/>
<pre></pre>