타입 서술 함수를 제거했지만 잘 추론됩니다. r1과 r4의 콜백 함수는 타입 서술 함수가 아니라서 두 번째 myFilter 타이핑에 해당됩니다. 여기서는 원본 배열의 타입과 동일한 T[]를 반환하기에 타입 추론을 제대로 할 수 있습니다.
lib.es5.d.ts 파일을 보세요.
lib.es5.d.ts
interface Array<T> {
...
filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
...
}
직접 만들었던 myFilter 메서드와 비슷하게 구성되어 있습니다. 두 번째 filter 메서드의 콜백 함수 반환값이 unknown이라는 점만 다릅니다. boolean 대신 unknown으로 한 이유는 실제로 filter 메서드가 반드시 boolean을 반환할 필요가 없기 때문입니다.