Persons를 필터링 해보자. person이 User
타입이라면 User[]
로 리턴한다.
들어오는 타입에 따라 다르게 리턴하는 것은 정말 못 하겠다.
🔻 공식적인 답안
getObjectKeys()
는 obj의 key를 리스트로 리턴한다.as (keyof T)
를 쓰지 않을 때는 string이, 쓸 땐 T의 key로 리턴된다.personType
이 user
라면 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];
});
});
}
여러 가지 함수를 선언한 후에 함수를 정의한다. 이때 정의 부분을 직접 호출할 수 없다.
정의1
정의2
정의3
선언
// @errors: 2554
function fn(x: string): void;
function fn() {
// ...
}
// 인자 하나가 들어와야 한다.
fn();
참고 자료