특정 함수 타입을 다른 함수 타임으로 괜찮은지 판단하는 것을 말한다.
이를 위해서는 아래의 두 가지 기준을 판단해야한다.
type A = () => number;
type B = () => 10;
let a: A = () => 10;
let b: B = () => 10;
a = b; // ✅ 10은 number에 할당이 가능하다.
b = a; // ❌`
A와 B 함수 타입이 있다고 가정할 때 A 반환값 타입이 B 반환값 타입의 슈퍼타입이라면 두 타입은 호환된다.
같다면 당연하게 호환이 될 수 있다.
다르다면, 서브 타입에 슈퍼 타입을 할당해줄 수 있다. (리턴 타입과 반대. 대부분의 타입 시스템의 동작 방식과 반대)
type C = (value: number) => void;
type D = (value: 10) => void;
let c: C = (value) => {};
let d: D = (value) => {};
c = d; // ❌
d = c; // ✅
type Animal = {
name: string;
};
type Dog = {
name: string;
color: string;
};
let animalFunc = (animal: Animal) => {
console.log(animal.name);
};
let dogFunc = (dog: Dog) => {
console.log(dog.name);
console.log(dog.color);
};
animalFunc = dogFunc; // ❌
dogFunc = animalFunc; // ✅
더 범위가 넓은 타입을 받아야만, 기존의 함수 동작에 문제가 생기지 않기 때문이다.
let animalFunc = (animal: Animal) => {
console.log(animal.name); // ✅
console.log(animal.color); // ❌
};
let dogFunc = (dog: Dog) => {
console.log(dog.name);
};