Skip to content

Latest commit

 

History

History
100 lines (64 loc) · 1.99 KB

File metadata and controls

100 lines (64 loc) · 1.99 KB

2. 함수 타입의 호환성

함수 타입의 호환성이란?

특정 함수 타입을 다른 함수 타입으로 괜찮은지 판단하는 것


2가지 기준으로 함수 타입의 호환성을 판단하게 됨

  1. 두 함수의 반환값 타입이 호환되는가?
  2. 두 함수의 매개변수의 타입이 호환되는가?

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

A와 B 함수 타입이 있다고 가정할 때 A 반환값 타입이 B 반환값 타입의 슈퍼타입이라면 두 타입은 호환됨

type A = () => number;
type B = () => 10;

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

a = b; // ✅
b = a; // ❌

→ 반대로는 불가능…


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

두 함수의 매개변수의 개수가 같은지 다른지에 따라 두 가지 유형으로 나뉘게 됨


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

두 함수 타입 C와 D가 있다고 가정할 때 두 타입의 매개변수가의 개수가 같다면 C 매개변수의 타입이 D 매개변수 타입의 서브 타입일 때에 호환됨

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; // ✅

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; // ❌