더북(TheBook)

사실상 타이핑을 다 한 것이나 다름없습니다. 다만 forEach 메서드의 반환값 타입이 T[]인지라 r2number[]가 되고, r3(string | number)[]가 됩니다. 실제로는 각각 never[], string[]이 되어야 합니다. 반환값의 타입이 배열의 타입과 달라지게 되므로 새로운 타입 매개변수가 필요합니다.

const r1 = [1, 2, 3].myFilter((v) => v < 2);
// const r1: number[]
const r2 = [1, 2, 3].myFilter((v, i, a) => {});
// const r2: number[]
const r3 = ['1', 2, '3'].myFilter((v) => typeof v === 'string');
// const r3: (string | number)[]
const r4 = [{ num: 1 }, { num: 2 }, { num: 3 }].myFilter(function(v) {
  return v.num % 2;
});
/*
const r4: {
  num: number;
}[]
*/

 

interface Array<T> {
  myFilter<S extends T>(callback: (v: T, i: number, a: T[]) => void, thisArg?: any): S[];
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.