Проблема в
...form.formParams.errorList[formIndex]
Давайте по порядку:
// допустим у нас есть следующие переменные с типами:
let obj: Obj;
let value: T;
// мы их собираем в такой объект:
const newObj = { ...obj, k: value };
тип для newObj компилятор будет выводить из контекста и получит
Obj & { k: T }
, ровно из того, что мы объединяем эти сущности.
Усложним пример:
let objs: Obj[];
let value: T;
let key: string;
const newObj = { ...objs[1], [key]: value };
Тип на выходе будет уже
Obj & { [key: string]: string }
, хотя objs на это раз у нас массив, компилятор видит, что мы берем индекс.
Что будет, если objs вместо простого
Obj[]
у нас будет
Obj[] | Obj[][]
?
Сначала мы берем значение по индексу из objs - эта операция вернет тип
Obj | Obj[]
.
После мы разворачиваем его через spread в объект и дописываем значение по индексу, получаем тип:
(Obj | Obj[]) & { [key: string]: string }
, тут еще Важно понимать, что типы в TS - это чистая математика, и данный тип полностью равносилен такому:
(Obj & { [key: string]: string }) | (Obj[] & { [key: string]: string })
А что, если Obj - это тоже
{ [key: string]: string }
? Мы сможем свернуть тип, упростив уравнение на типах:
(Obj & Obj) | (Obj[] & Obj)
(Obj) | (Obj[] & Obj)
(Obj & Obj[]) | (Obj & Obj)
(Obj & Obj[]) | (Obj)
Obj & Obj[]
И это именно тот тип, который получил у Вас компилятор