매개변수를 보면 string -> string | number이므로 b -> a인 상황입니다. 그런데 a를 b에 대입할 수 있습니다. b -> a에서 T<a> -> T<b>이므로 매개변수가 반공변성을 가지고 있습니다.
반대는 불가능합니다. 에러가 발생합니다. 매개변수의 경우는 반공변성을 가지는 것을 확인했습니다.
function a(x: string): number {
return 0;
}
type B = (x: string | number) => number;
let b: B = a;
// Type '(x: string) => number' is not assignable to type 'B'. Types of parameters 'x' and 'x' are incompatible. Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.
여기서 strict 옵션을 해제하면 어떻게 될까요? 반환값이었을 때와는 다르게 에러가 발생하지 않습니다. 즉, 매개변수는 strict 옵션일 때 반공변성, strict 옵션이 아닐 때는 이변성을 가집니다. 이변성을 가지는 이유는 b -> a일 때, T<b> -> T<a>도 되고, T<a> -> T<b>도 되기 때문입니다.
앞으로 이 관계를 참고해서 함수에 다른 함수를 대입하세요. 매개변수는 반공변성 또는 이변성이라는 것만 기억해도 됩니다.