인프런 커뮤니티 질문&답변

이종민님의 프로필 이미지

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편

filter 타입 직접 만들기

filter 질문 있습니다.

해결된 질문

23.02.09 12:33 작성

·

308

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

이종민님의 프로필 이미지
이종민
질문자

2023. 02. 09. 12:38

공부해서 유추해본 결과

저희가 작성한 필터링 방식은 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를 쓰지 않아도 되는게 맞는 걸까요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2023. 02. 09. 13:09

네 다만 기존 배열도 is를 안 쓰면 타입 추론이 제대로 안 됩니다. 한 번 해보세요.

이종민님의 프로필 이미지
이종민
질문자

2023. 02. 09. 20:30

오 감사합니다 선생님 새로운걸 알아가네요!