myReduce 메서드의 초깃값은 iV로 이름 지었고, 초깃값이 없을 수도 있으므로 옵셔널로 선언했습니다. 현재 반환값의 타입이 요소의 타입과 같게 설정되어 있어 에러가 발생합니다. reduce 메서드의 반환값은 요소의 타입과 다를 수도 있으므로 오버로딩을 추가해야 합니다.
const r1 = [1, 2, 3].myReduce((a, c) => a + c); // 6
const r2 = [1, 2, 3].myReduce((a, c, i, arr) => a + c, 10); // 16
const r3 = [{ num: 1 }, { num: 2 }, { num: 3 }].myReduce(
function(a, c) {
return { ...a, [c.num]: 'hi' };
},
{},
); // { 1: 'hi', 2: 'hi', 3: 'hi' }
const r4 = [{ num: 1 }, { num: 2 }, { num: 3 }].myReduce(
function(a, c) {
return a + c.num;
},
'',
); // '123'
interface Array<T> {
myReduce(callback: (a: T, c: T, i: number, arr: T[]) => T, iV?: T): T;
myReduce<S>(callback: (a: S, c: T, i: number, arr: T[]) => S, iV: S): S;
}