Closed hyeyoonS closed 2 months ago
export function filterUsers(persons: Person[], criteria: Partial<User>): User[] {
return persons.filter(isUser).filter((user) => {
const criteriaKeys = Object.keys(criteria) as (keyof User)[]
return criteriaKeys.every((fieldName) => {
return user[fieldName] === criteria[fieldName]
})
})
}
// filterUsers 함수는 결론적으로 2번째 인자로 age 객체를 보내고 그것을 User객체로 받기 때문에 오류가 난다.
// `User` 타입의 모든 속성이 존재해야지 해당 함수가 실행되게 된다.
// 따라서 부분집합의 개념인 `Partial` 유틸리티 함수를 사용한다.
export function filterUsers(persons: Person[], criteria: Partial<User>): User[] {
return persons.filter(isUser).filter((user) => {
const criteriaKeys = Object.keys(criteria) as (keyof User)[];
return criteriaKeys.every((fieldName) => {
return user[fieldName] === criteria[fieldName];
});
});
}
filterUsers(persons, { age: 23 }).forEach(logPerson);
❓문제
주어진 코드에서 유틸리티 타입을 활용해 filterUsers의 타입을 올바르게 수정해보아요!
🎯답변
type, name, age, occupation
를 전달해야 합니다. 그런데 filterUsers 함수는 user 중 특정 속성값이 일치하는 user를 필터하는 함수이므로, User이 아닌 User의 일부 속성만을 받을 수 있도록 수정해야 합니다. ▶ Partial을 이용해서 User의 프로퍼티를 선택적 프로퍼티로 변경하기!🤔 Partial이 뭐지?
이렇게 수정하면
이렇게 일부 속성이 일치하는 user을 필터할 수 있습니다.