Уровень безопасности и удобства, обеспечиваемый современными языками, находится на рекордно высоком уровне и быстро улучшается. Тем не менее, одна функция, которую я еще не видел в языке, — это возможность вручную удалять область переменных для текущей области. Рассмотрим следующий фрагмент 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 закрепляет семантику того, что мы здесь делаем, как для компилятора, так и для будущих программистов без косвенного введения новой функции.