인터페이스나 타입 Alias(별칭) 등을 사용하여 함수의 타입을 정의할 때, 해당 함수의 타입 정의를 의미한다.
type Add = (a: number, b: number) => number;
const add: Add = (a, b) => a + b;
하나의 함수에 대해 여러 개의 Call Signature 를 정의하는 것을 의미한다.
동일한 함수명이지만 각각 다른 매개변수 및 반환 타입을 설정할 수 있다.
// 여러 개의 서로 다른 call signatures 를 가지고 있을 때
type Config = {
path: string;
state: object;
};
type Push = {
(path: string): void;
(config: Config): void;
};
const push: Push = (config: string | Config) => {
if (typeof config === 'string') {
console.log(config);
} else {
console.log(config.path, config.state);
}
};
// 또 다른 overloading 예시
type Add = {
(a: number, b: number): number;
(a: number, b: number, c: number): number;
};
const add: Add = (a, b, c?: number) => {
if (c) return a + b + c;
return a + b;
};
add(1, 2);
add(1, 2, 3);
객체 지향 프로그래밍에서 하나의 인터페이스나 추상 클래스를 사용하여 여러 타입을 지원하는 개념
이를 통해 다양한 클래스나 객체가 동일한 방식으로 동작할 수 있다. ( = 코드의 재사용 성과 유지 보수성이 증가한다. )
class Animal {
speak(): void {
console.log('Animal makes a sound.');
}
}
class Dog extends Animal {
speak(): void {
console.log('Dog barks.');
}
}
class Cat extends Animal {
speak(): void {
console.log('Cat meows.');
}
}
function animalSpeak(animal: Animal): void {
animal.speak();
}
const dog = new Dog();
const cat = new Cat();
animalSpeak(dog); // 출력: 'Dog barks.'
animalSpeak(cat); // 출력: 'Cat meows.'
데이터 타입을 일반화하여 여러 다른 타입에서 재사용 할 수 있도록 하는 기능이다.
함수나 클래스를 정의할 때, 데이터 타입을 파라미터화하여 추상적은 타입으로 사용한다.
데이터 타입을 쓰는 자리에 ‘<>’ 을 통해 괄호 안에 파라미터를 선언한다.
컴파일 시점에 데이터 타입 안정성을 유지할 수 있다.
// '<>' 안에 꼭 T 가 올 필요는 없다. 사용자정의!
// vscode 에 복사해서 각각의 superPrint 가 가지고 있는 타입을 살펴보자
function superPrint<T>(a: T[]) {
return a[0];
}
const a = superPrint([1, 2, 3, 4]);
const b = superPrint([true, false, true, true]);
const c = superPrint(['a', 'b', 'c', 'd']);
const d = superPrint([1, 2, true, false, 'a', 'b']);