Здесь, думаю, бага тайпскрипта. С одной стороны логично, что он тебе говорит, что "Нельзя строку или число сложить со строкой или числом" (потому что складывать надо число с числом). С другой стороны TS вполне кушает такое:
const a: string | number = 1; const b: string | number = '2'; const z = a + b;
Он понимает, что z на выходе будет только строка (потому что число плюс строка на выходе строка).

При этом даже так работает:
interface MyArray<T> { reduce<T>(fn: (arg:T) => T): T; } let arr = [1, 2, 3, 4, '5']; let results = arr.reduce((sum, current) => 1 + '2', 0); results
То есть мы явно складываем число и строку и ТС это не парит.

Для тебя выход: или использовать только числа, или если ты допускаешь, что могут приходить строки, но это все равно числа, то парсить их.
interface MyArray<T> { reduce<T>(fn: (arg:T) => T): T; } let arr = [1, 2, 3, 4, '5']; let results = arr.reduce<number>((sum, current) => sum + (typeof current === "string" ? parseInt(current) : current), 0); results

Обрати внимание, что <number> в такой конструкции обязателен, потому что reduce сам по себе тоже дженерик, и в него можно передать какой тип ожидается в результате. Если ты не указываешь явно, то он берет из входящих параметров. Так как у тебя на входе массив чисел или строк, то он допускает, что sum тоже число или строка, и тоже ругается на то, что его нельзя суммировать. Указав <number> мы ему сообщаем, что результат у него четко number, и тут уже reduce будет требовать, чтобы каждая итерация у тебя возвращала четко number и будет считать, что sum тоже всегда number.