더북(TheBook)

반대로 Intersection<T> 타입에서는 ab가 메서드입니다. 메서드의 매개변수 pa, pb에 같은 U 타입 변수를 선언했습니다. Intersection 타입을 사용할 때는 pa1 | 2, pb2 | 3 타입을 넣었습니다. 그랬더니 Result22가 되었습니다. 이는 papb의 인터섹션입니다. 기본적으로 같은 이름의 타입 변수는 서로 유니언이 되지만, 매개변수인 경우에는 다릅니다. 매개변수는 반공변성을 갖고 있으므로 매개변수인 경우에는 인터섹션이 됩니다. 같은 이유로, 반환값 타입을 같은 타입 변수로 선언한 경우에는 반환값이 공변성을 갖고 있기에 유니언이 됩니다.

실무에서 볼 일은 거의 없지만 같은 타입 변수 중에서 하나가 매개변수고, 하나가 반환값이면 어떻게 될까요?

type ReturnAndParam<T> = T extends { 
  a: () => infer U, 
  b: (pb: infer U) => void
} ? U : never;
type Result3 = ReturnAndParam<{ a: () => 1 | 2, b(pb: 1 | 2 | 3): void }>;
// type Result3 = 1 | 2
type Result4 = ReturnAndParam<{ a: () => 1 | 2, b(pb: 2 | 3): void }>;
// type Result4 = never
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.