더북(TheBook)
const r1 = [1, 2, 3].myFilter((v) => v < 2);
// Signature '(v: number): boolean' must be a type predicate.
const r2 = [1, 2, 3].myFilter((v, i, a) => {});
// Signature '(v: number, i: number, a: number[]): void' must be a type predicate.
const r3 = ['1', 2, '3'].myFilter((v) => typeof v === 'string');
// Signature '(v: number): boolean' must be a type predicate.
const r4 = [{ num: 1 }, { num: 2 }, { num: 3 }].myFilter(function(v) {
  return v.num % 2;
});
// Signature '(v: { num: number; }): number' must be a type predicate.

interface Array<T> {
  myFilter<S extends T>(callback: (v: T, i: number, a: T[]) => v is S, thisArg?: any): S[];
}

반환값 부분에 is 연산자를 사용해 타이핑하면 됩니다. 다만 테스트 사례의 콜백 함수에 전부 에러가 발생합니다. 에러 메시지는 전부 콜백 함수가 타입 서술 함수가 아니라는 에러입니다. 모든 함수를 타입 서술 함수로 만듭시다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.