반대로 Intersection<T> 타입에서는 a와 b가 메서드입니다. 메서드의 매개변수 pa, pb에 같은 U 타입 변수를 선언했습니다. Intersection 타입을 사용할 때는 pa에 1 | 2, pb에 2 | 3 타입을 넣었습니다. 그랬더니 Result2는 2가 되었습니다. 이는 pa와 pb의 인터섹션입니다. 기본적으로 같은 이름의 타입 변수는 서로 유니언이 되지만, 매개변수인 경우에는 다릅니다. 매개변수는 반공변성을 갖고 있으므로 매개변수인 경우에는 인터섹션이 됩니다. 같은 이유로, 반환값 타입을 같은 타입 변수로 선언한 경우에는 반환값이 공변성을 갖고 있기에 유니언이 됩니다.
실무에서 볼 일은 거의 없지만 같은 타입 변수 중에서 하나가 매개변수고, 하나가 반환값이면 어떻게 될까요?
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