```
type Age = number;- 타입 별칭은 복잡한 타입을 DRY(don't repeat yourself=반복하지말라)하지 않도록 해준다. 변수가 어떤 목적으로 사용되었는지 쉽게 이해할 수 있도록 도와준다(사바사).
이 문법은 화살표 함수와 아주 비슷하다.
// 타입스크립트 표현
(a:number, b:number) => number
// 타입스크립트 활용 표현
type add = (a:number, b:number) => number
함수 호출 시그니처는 값이 아닌 타입 정보만 포함한다.(= 타입 수준 코드 정보만 포함한다.)
또한, 바디를 포함하지 않아 타입스크립트가 타입을 추론할 수 없기때문에 반환 타입을 명시해야 한다.
위의 단축형 호출 시그니처를 더욱 명확하게 표현할 수 있다.
//단축형 호출 시그니처
type add = (a:number, b?:number) => number
//전체 호출 시그니처
type add = {
(a:number, b?:number):number
}
간단한 함수라면 단축형을 주로 사용,
복잡한 함수라면 전체 시그니처를 사용.
오버로드 된 함수 : 호출 시그니처가 여러 개인 함수.
대부분의 프로그래밍 언어에서 여러 매개변수를 인수로 받아 어떤 타입의 값을 반환하는 함수를 선언한 다음, 이 함수가 요구하는 정확한 매개변수 집합을 건네 함수를 호출하면 항상 똑같은 타입의 반환값을 받게 된다. 타입스크립트는 이런 동적 특징을 오버로드된 함수 선언을 통해 제공하고, 입력 타입에 따라 달라지는 함수의 출력 타입은 정적 타입 시스템으로 각각 제공한다. 고급기능에 속한다!
type Vacation = {
(from: Date, to: Date, destination: string): Holiday;
}
//type Vacation을 편도 여행과 왕복 여행을 지원하도록 코드를 수정했다.
type Vacation = {
(from: Date, to: Date, destination: string): Holiday;
(from: Date, destination: string): Holiday;
}
// vacation의 구현 코드다.
let vacation: Vacation = (from, to, destination) => { //... };
위의 코드는 에러를 발생시킨다. 왜일까?
-> 조합된 오버로드 시그니처가 존재하지 않기 때문이다.(자동으로 추론하지 않는다)
직접 선언해서 다시 코드를 바꿔보자.
// 편도 여행과 왕복 여행 지원한 코드다.
type Vacation = {
(from: Date, to: Date, destination: string): Holiday;
(from: Date, destination: string): Holiday;
} // - 1
// vacation의 구현 코드다.
let vacation: Vacation = (
from: Date,
toOrDestination: Date | string,
destination?: string
) => { // - 2
//...
};