더북(TheBook)
const r1 = [1, 2, 3].myFilter((v): v is number => v < 2);
const r2 = [1, 2, 3].myFilter((v, i, a): v is never => false);
const r3 = ['1', 2, '3'].myFilter((v): v is string => typeof v === 'string');
const r4 = [{ num: 1 }, { num: 2 }, { num: 3 }].myFilter(
  function(v): v is { num: number } {
    return v.num % 2 === 1;
  }
);

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

한 가지 더 아쉬운 점이 있습니다. 원래 r1r4는 타입 서술 함수로 만들지 않았어도 타입 추론이 잘 되었습니다. 그러므로 r1, r4는 타입 서술 함수가 아니어도 잘 추론되면 좋겠습니다. 타입 서술 함수를 활용한 타이핑과 타입 서술 함수가 없을 때의 타이핑을 모두 사용하고 싶습니다. 이럴 때는 오버로딩을 활용하면 됩니다.

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