Уровень безопасности и удобства, обеспечиваемый современными языками, находится на рекордно высоком уровне и быстро улучшается. Тем не менее, одна функция, которую я еще не видел в языке, — это возможность вручную удалять область переменных для текущей области. Рассмотрим следующий фрагмент Typescript:

function renderPages = (pages: Page[]) => {
    console.log(`Rendering ${pages.length} pages`);
    return pages.map(this.renderPage);
}

Ничего особенного не происходит, но позже было решено, что мы должны отображать только непустые страницы. Программист радостно записывает следующее изменение:

function renderPages = (pages: Page[]) => {
    const visiblePages = pages.filter(page => page.length > 0);
    console.log(`Rendering ${visiblePages.length} pages`);
    return pages.map(this.renderPage);
}

Ааааа у нас ошибка. Хотя программист отфильтровал страницы, он забыл фактически использовать отфильтрованную переменную вместо нефильтрованной версии. В таких случаях проверка типов не очень помогает, поскольку новая переменная имеет тот же тип, что и старая. (примечание: пожалуйста, можем ли мы иметь номинально типизированные псевдонимы?)

Появляется descopes: директива, которую я хотел бы видеть в императивных языках, которая позволяет нам легко вывести переменную из области видимости для оставшейся части текущей области.

Как это может работать?

function renderPages = (pages: Page[]) => {
    const visiblePages = pages
        .filter(page => page.length > 0) descopes pages;
    console.log(`Rendering ${visiblePages.length} pages`);
    return pages.map(this.renderPage); // Compiler error!
}

Конечно, приличные тесты могли бы обнаружить указанную выше ошибку, но descopes закрепляет семантику того, что мы здесь делаем, как для компилятора, так и для будущих программистов без косвенного введения новой функции.