한 입 크기로 잘라먹는 타입스크립트
Search

함수 타입의 호환성

 
chapter2.ts에서 실습과 함께 진행합니다.

함수 타입의 호환성이란?

함수 타입의 호환성이란 특정 함수 타입을 다른 함수 타입으로 괜찮은지 판단하는 것을 의미합니다.
다음 2가지 기준으로 함수 타입의 호환성을 판단하게 됩니다.
  • 두 함수의 반환값 타입이 호환되는가?
  • 두 함수의 매개변수의 타입이 호환되는가?
첫번째 기준부터 차례대로 살펴보겠습니다.
 

기준 1 : 반환값 타입이 호환되는가?

A와 B 함수 타입이 있다고 가정할 때 A 반환값 타입이 B 반환값 타입의 슈퍼타입이라면 두 타입은 호환됩니다.
코드를 불러오는 중 입니다 ...
A의 반환값 타입은 Number, B의 반환값 타입은 Number Literal 입니다. 따라서 변수 a에 b를 할당하는 것은 가능하나 반대로는 불가능 합니다.
 

기준 2 : 매개변수의 타입이 호환되는가?

두번째 기준인 매개변수의 타입이 호환되는지 판단할 때에는 두 함수의 매개변수의 개수가 같은지 다른지에 따라 두가지 유형으로 나뉘게 됩니다.

2-1. 매개변수의 개수가 같을 때

두 함수 타입 C와 D가 있다고 가정할 때 두 타입의 매개변수의 개수가 같다면 C 매개변수의 타입이 D 매개변수 타입의 서브 타입일 때에 호환됩니다.
코드를 불러오는 중 입니다 ...
C 매개변수의 타입은 Number, D 매개변수의 타입은 Number Literal 입니다. 따라서 C 매개변수의 타입이 D 매개변수의 슈퍼타입이므로 D를 C로 취급하는것은 불가능하나 반대로는 가능합니다.
이는 반환값 타입과 반대됩니다. 마치 다운캐스팅을 허용하는 것 같아 보입니다.
 
이렇게 되는 이유는 두 함수의 매개변수의 타입이 모두 객체 타입일때 좀 더 두드러집니다.
코드를 불러오는 중 입니다 ...
animalFunc에 dogFunc를 할당하는 것은 불가능합니다. dogFunc의 매개변수 타입이 animalFunc 매개변수 타입보다 작은 서브타입이기 때문입니다. 반대로는 가능합니다.
animalFunc = dogFunc를 코드로 표현해보면 다음과 같습니다.
코드를 불러오는 중 입니다 ...
animalFunc 타입의 매개변수 타입은 Animal 타입입니다. 그러나 dogFunc 함수 내부에서는 name과 color 프로퍼티에 접근합니다. 따라서 이렇게 할당이 이루어지게 되면 animal.color처럼 존재할거라고 보장할 수 없는 프로퍼티에 접근하게 됩니다.
반대로 dogFunc = animalFunc를 코드로 표현하면 다음과 같습니다.
코드를 불러오는 중 입니다 ...
dogFunc 함수의 매개변수는 Dog 타입입니다. 그리고 animalFunc 함수 내부에서는 name 프로퍼티에만 접근합니다. 이 코드는 안전합니다.
그러므로 두개의 함수 타입 C와 D가 있을 때 두 매개변수의 개수가 같을 경우 D를 C로 취급하려면 C 매개변수의 타입이 D 매개변수 타입의 서브 타입이어야 합니다.

2-2. 매개변수의 개수가 다를 때

매개변수의 개수가 다를 때에는 비교적 간단합니다.
코드를 불러오는 중 입니다 ...
 
PREV함수 타입 표현식과 호출 시그니쳐
NEXT함수 오버로딩