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