да, нужен рантайм typeof, чтоб отделить один тип от другого, в этом и разница
не нужен. тип string | number говорит что в рантайме может прийти и строка и намбер. на этом статика кончается и то что ты делаешь в рантайме это вообще другие заботы
вот только f то ничего не знает об этом, она свято уверена что придет string | number
ну естественно, потому что ты ее обманываешь. потому что any кастится в любой тип, опять же потому что any динамична и подразумевает что ты сам знаешь что делаешь