TS error jak najbardziej zasadny, ponieważ nie zawsze musisz manualnie typować dane, by TS wiedział, jakich danych ma się spodziewać. Zobacz na taki przypadek "const num = 1". Tutaj również TS doskonale wie, że zmienna num przechowuje jakąś daną o typie number, bo w zasadzie sam to określiłem poprzez przypisanie wartości o typie number do zmiennej.
Dokładnie to samo dzieje się w Twoim przypadku. Czyli TS sam interpretuje, że w obiekcie, który przechowuje zmienna obj, ma spodziewać się dokładnie takich danych, jakie zadeklarowałeś i żadnych innych, więc przy próbie przypisania nieoczekiwanej danej (fourth), rzuca errorem.
Posłużenie się interfejsem rozwiąże Twój problem:
interface Obj {
first: number;
second: number;
third: number;
fourth?: number;
}
let obj: Obj = {
first: 1,
second: 2,
third: 3,
};
obj = { ...obj, fourth: 4 };