type PowerUser = Omit<User, "type"> & Omit<Admin, "type"> & {
type: 'powerUser'
};
User와 Admin에서 타입을 없애고 새로운 타입으로 'powerUser'를 지정해준다.
type PowerUser = Pick<User, "name" | "age" | "occupation"> & Pick<Admin, "name" | "age" | "role"> & {
type: 'powerUser'
};
마우스를 올렸을때 위와 같이 나오는데, 결국 아래와 같다.
type PowerUser = {
type: 'powerUser',
name: string,
age: number,
occupation: string,
role: string
}
타입이 powerUser인데 occupation이나 role 둘중 하나가 없다면 에러가 난다. User | Admin이 아니게 되는것.
결론적으로 User타입(타입을 제외한), Admin타입(타입을 제외한), {type: 'powerUser'} 의 합집합이다.
이렇게 타입을 가공할때는 인터페이스로 하면 안되고 type으로 해야하는 것 같다.