Интерфейс описывает форму объекта — какие у него должны быть поля и каких типов:
interface User { id: number; name: string; isAdmin?: boolean; // необязательное поле }
Теперь объект обязан соответствовать форме:
const u: User = { id: 1, name: "Аня" }; // ок (isAdmin не обязателен) const bad: User = { id: 1 }; // ошибка: нет name
Функция, принимающая User, получает полную подсказку по полям:
function welcome(user: User): string { return "Привет, " + user.name; }
Редактор автодополнит user. и не даст обратиться к несуществующему полю. В больших проектах это резко снижает количество багов и ускоряет рефакторинг: переименовали поле в интерфейсе — компилятор покажет все места, которые надо поправить.