Just for anyone coming to this topic now, I used @Tedde / @jalbert's solution and it worked a treat, but I've found it can actually be achieved with a bit less code. @jalbert added minZoom and maxZoom options to the tileLayer, essentially negating the need for the zoomend Event Listener that @Tedde suggested. So in short, the following code is all that's required:

map.options.minZoom = 4; map.options.maxZoom = 17; var topLayer = L.tileLayer('https://b.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, ', minZoom: 12, maxZoom: 17 }).addTo(map);