이정환 님의 한 입 크기로 잘라먹는 타입스크립트 를 수강한 내용 입니다.
함수 타입의 호환성이란 ?
함수 타입의 호환성이란 특정 함수 타입을 다른 함수 타입으로 괜찮은지 판단하는 것을 의미합니다.
다음 2가지 기준으로 함수 타입의 호환성을 판단하게 됩니다.
두 함수의 반환 값 타입이 호환되는가?
두 함수의 매개변수의 타입이 호환되는가?
1. 두 함수의 반환 값 타입이 호환되는가 ?
A와 B 함수 타입이 있다고 가정할 때
- A 반환값 타입이 B 반환값 타입의
슈퍼타입
이라면 두 타입은 호환됩니다.
A의 반환값 타입은 Number, B의 반환값 타입은 Number Literal 입니다.
따라서 변수 a에 b를 할당하는 것은 가능하나 반대로는 불가능 합니다.(다운 캐스팅 ❌)
b = a
를 넣는 것은, a가 b보다 큰 범주이므로 다운 캐스팅이 일어납니다.
2. 두 함수의 매개변수의 타입이 호환되는가?
2-1. 매개변수의 개수가 같을 때
c = d
는 D 타입을 C 타입으로 취급하겠다는 말 입니다.C 타입은 Number, D 타입은 Number Literal 입니다.
따라서 C 타입이 D 슈퍼타입이므로 D를 C로 취급하는것은 불가능하나 반대로는 가능합니다.
이는 반환값 타입과 반대됩니다. 마치 다운캐스팅을 허용하는 것 같아 보입니다.
좀 더 이해를 돕기 위해 객체 타입인 경우를 살펴보겠습니다.
animalFunc에 dogFunc를 할당하는 것은 불가능합니다.
- Animal 타입이 Dog 타입의
슈퍼타입
입니다.(조건이 더 적기 때문)
animalFunc = dogFunc
를 코드로 표현해보면 다음과 같습니다.
dogFunc 함수 내부에서는 name과 color 프로퍼티에 접근합니다.
따라서 이렇게 할당이 이루어지게 되면
animal.color
처럼 존재할거라고보장할 수 없는 프로퍼티에 접근
하게 됩니다.그래서 업 캐스팅을 차단 합니다.
반대로 dogFunc = animalFunc
를 코드로 표현하면 다음과 같습니다.
- animalFunc 함수 내부에서는
name 프로퍼티에만 접근
합니다. 이 코드는 안전합니다.
정리하자면, 매개변수의 개수가 같은 경우 업 캐스팅은 ❌, 다운 캐스팅 ✅