Вы пытаете переопределить свойство window.name, т.к. в данном коде контекст выполнения это window, а значит name это window.name. Данное свойство если я не ошибаюсь, имеет встроенный геттер и сеттер, которые при присвоении ему значения, переводят его в строку (или может при получении через getter, не важно). Попробуйте написать name={}; console.warn(name);, и получите [object Object]. т.е. получается, что в этом свойстве всегда строка, поэтому typeof возвращает строку. Даже null переводится в "null". Если вы в теле функции определите имя name, то оно будет взято из лексического объекта этой функции, а не window, и такой проблемы не будет. Или же пишите
let name = 20;