공부/TypeScript
TypeScript #6 Generic
porkbellyYam
2023. 3. 12. 20:29
제네릭(Generic)은 TypeScript에서 타입 안정성을 유지하면서 재사용성을 높이기 위한 기능입니다.
함수나 클래스를 작성할 때, 그 타입이나 인터페이스를 지정하지 않고 일반화된 형태로 작성할 수 있도록 해줍니다. 이렇게 작성된 함수나 클래스는 나중에 호출되거나 인스턴스화될 때, 타입 인자를 전달하여 구체화할 수 있습니다.
//Generic
function getSize(arr: number[] | string[] | boolean[]){
return arr.length;
}
const arr1 = [1,2,3];
getSize(arr1); //3
const arr2 = ['a','b','c'];
getSize(arr2); //4
const arr3 = [true, true, false];
getSize(arr3);
const arr4 = [{}, {}, {name:"Tim"}];
getSize(arr4);
getSize 함수에 들어 갈 수 있는 매개변수의 타입을 일일히 입력해야하지만 Generic 문법을 이용하면 쉽게 처리가 가능
getSize를 Generic 을 이용해서 다음과 같이 변경했다.
function getSize<T>(arr: T[]):number{
return arr.length;
}
Ex1)
interface Mobile<T>{
name: string;
price: number;
option: T; //Option에는 어떤 데이터가 할당 될 지 아직은 알수가 없다. 그래서 Generic을 사용
}
const m1:Mobile<object> = {
name: "s21",
price: 1000000,
option:{
vendor:"SKT",
color:"red",
coupon:false,
},
};
const m2:Mobile<string> = {
name:"iphone11",
price:200000,
option:"apple",
}
Ex2)
interface Student {
name: string;
age: number;
}
interface Person {
name: string;
age: number;
}
interface CEO {
age: number;
}
const student: Student = { name: "a", age: 10 };
const person: Person = { name: "b", age: 11 };
const ceo: CEO = { age: 10 };
function showName<T extends { name: string }>(data: T): string {
return data.name;
}
console.log(showName(student)); // "a"
console.log(showName(person)); // "b"
console.log(showName(ceo)); // 컴파일 에러: Property 'name' is missing