반대로 해볼까요? b -> a인 상황에서 함수 a를 타입 b에 대입하려고 합니다.
function a(x: string): number | string {
return 0;
}
type B = (x: string) => number;
let b: B = a;
// Type '(x: string) => string | number' is not assignable to type 'B'. Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'.
string | number를 number에 대입할 수 없다는 에러가 발생합니다. 여기서 strict 옵션(또는 strictFunctionTypes)을 해제하면 어떻게 될까요? 여전히 에러가 발생합니다. 즉, 반환값에 대해서는 항상 공변성을 가진다고 볼 수 있습니다.
매개변수의 경우는 strict 옵션에서 반공변성을 가진다고 했습니다. 다음 코드를 봅시다.
function a(x: string | number): number {
return 0;
}
type B = (x: string) => number;
let b: B = a;