해결된 질문
작성
·
313
0
기존 배열 함수를 사용할 때는 filter 메서드의 인자로 v is string을 넣어주지 않아도 작동되는데 선생님께서 정의하신 filter 메서드의 경우는 callback에 v is string을 넣어줘야만 작동되는지 궁금합니다.
기존의 filter
const d = [1, 2, '3', 4, '5'];
d.filter((value) => typeof value === 'string');
수업 시간에 작성한 filter
interface Arr<T> {
forEach(callback: (value: T, index: number) => void): void;
// map(callback: (value: T, index: number) => any): any[];
map<U>(callback: (value: T, index: number) => U): U[];
filter<S extends T>(callback: (value: T, index: number) => value is S): S[];
}
const c: Arr<string | number> = ['1', 2, '3', 4, '5'];
const d = c.filter((item): item is string => typeof item === 'string');
답변 1
1
공부해서 유추해본 결과
저희가 작성한 필터링 방식은 custom type guard를 썼기 때문에 is를 명시해줘야 하지만
d.ts 파일을 보니 아래와 같은 코드가 있었네요. 때문에 명시적으로 custom type guard를 명시적으로 쓰지 않아도 unknown으로 처리되도록 되어 있는 것 같습니다.
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
혹시 이렇게 구현되었기 때문에 기존의 filter 함수는 custom typeguard를 쓰지 않아도 되는게 맞는 걸까요?
네 다만 기존 배열도 is를 안 쓰면 타입 추론이 제대로 안 됩니다. 한 번 해보세요.