반대로 해볼까요? 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 | numbernumber에 대입할 수 없다는 에러가 발생합니다. 여기서 strict 옵션(또는 strictFunctionTypes)을 해제하면 어떻게 될까요? 여전히 에러가 발생합니다. 즉, 반환값에 대해서는 항상 공변성을 가진다고 볼 수 있습니다.

    매개변수의 경우는 strict 옵션에서 반공변성을 가진다고 했습니다. 다음 코드를 봅시다.

    function a(x: string | number): number {
      return 0;
    }
    type B = (x: string) => number;
    let b: B = a;
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.