Typescript-exercises 06

hotbreakb·2022년 6월 13일
0

typescript-exercises

목록 보기
6/12

문제

Persons를 필터링 해보자. person이 User타입이라면 User[]로 리턴한다.

코드

들어오는 타입에 따라 다르게 리턴하는 것은 정말 못 하겠다.

🔻 공식적인 답안

  • getObjectKeys()는 obj의 key를 리스트로 리턴한다.
    • as (keyof T)를 쓰지 않을 때는 string이, 쓸 땐 T의 key로 리턴된다.
  • personTypeuser라면 User[]를, admin이라면 Admin[]을 리턴한다.
  • filterPersons(..., 'user와 admin이 아닌 다른 string', ...)은 호출할 수 없다.
const getObjectKeys = <T>(obj: T) => Object.keys(obj) as (keyof T)[];

export function filterPersons(persons: Person[], personType: 'user', criteria: Partial<Omit<User, 'type'>>): User[];
export function filterPersons(persons: Person[], personType: 'admin', criteria: Partial<Omit<Admin, 'type'>>): Admin[];
export function filterPersons(persons: Person[], personType: string, criteria: Partial<Person>): Person[] {
    return persons
        .filter((person) => person.type === personType)
        .filter((person) => {
            let criteriaKeys = getObjectKeys(criteria);
            return criteriaKeys.every((fieldName) => {
                return person[fieldName] === criteria[fieldName];
            });
        });
}

Function Overloads

여러 가지 함수를 선언한 후에 함수를 정의한다. 이때 정의 부분을 직접 호출할 수 없다.

정의1
정의2
정의3
선언
// @errors: 2554
function fn(x: string): void;
function fn() {
  // ...
}

// 인자 하나가 들어와야 한다.
fn();

참고 자료

profile
글쟁이 프론트 개발자, 헬렌입니다.

0개의 댓글