함수 타입의 호환성 - 함수와 타입

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

/**
 * 함수 타입의 호환성
 * 특정 함수 타입을 다른 함수 타입으로 취급해도 괜찮은가를 판단하는
 * 1. 반환값의 타입이 호환되는가
 * 2. 매개변수의 타입이 호환되는가
 */

// 기준1. 반환값이 호환되는가
type A = () => number;
type B = () => 10;

let a: A = () => 10;
let b: B = () => 10;

a = b;
// b = a; 다운 캐스팅이라 안됨

기준2. 매개변수가 호환되는가

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

// 기준2. 매개변수가 호환되는가
// 2-1. 매개변수의 개수가 같을 때

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 testFunc = (animal: Animal) => {
    console.log(animal.name);
    // console.log(animal.color);
}

let testFunc2 = (dog: Dog) => {
    console.log(dog.name);
}

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

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

type Func1 = (a: number, b: number) => void;
type Func2 = (a: number) => void;

let func1: Func1 = (a, b) => {};
let func2: Func2 = (a) => {};

// 매개변수 개수가 더 적은 쪽이 많은 쪽으로 가야지만 호환됨
func1 = func2;
// func2 = func1;