카테고리 없음
TypeScript #7 제네릭 Generics
nh_3521099031483
2024. 5. 29. 18:17
// Generic
// 제너릭을 이용하면 클래스나 함수, 인터페이스를 다양한 타입으로 재사용할 수 있다.
function getSize(arr: number[]):number {
return arr.length;
}
const arr1 = [1, 2, 3];
getSize(arr1); // 3
const arr2 = ["a", "b", "c"];
getSize(arr2) // 이렇게 매개변수의 타입이 바뀌었는데 동일한 함수를 재사용 하고싶다면
// 함수 오버로드를 사용하던가 유니온 타입을 사용할 수 있다.
// 사용예제
function getSize2<T>(arr: T[]):number { // <>꺽쇠에 대문자 T를 적어준다, 이를 타입파라미터라고 한다. X나 A이런것을 적어도 상관없다.
return arr.length;
}
const arr3 = [1, 2, 3];
getSize2<number>(arr3); // 3
// 사용하는 쪽에서 꺽쇠로 타입을 적어준다.
const arr4 = ["a", "b", "c"];
getSize2<string>(arr4)
const arr5 = [false, true, true];
getSize2(arr5)
// 사실 꺽쇠로 기입해주지 않아도 타입스크립트는 전달되는 매개변수를 보고 타입을 알아서 리턴해준다.
const arr6 = [{}, {}, {name: "Tim"}];
getSize2(arr6)
// 인터페이스 사용예제
interface Mobile<T> {
name: string;
price: number;
// option: any; // 어떤 데이터가 올지 모르는 상태, 이럴 때 제너릭을 쓸 수 있다.
option: T;
}
const m1: Mobile<object> = { // option의 타입이 객체니까
name: "s21",
price: 1000,
option: {
color: "red",
coupon: false,
},
};
const m2: Mobile<string> = {// option의 타입이 string이니까
name: "s21",
price: 1000,
option: "good",
};
interface User {
name: string;
age: number;
}
interface Car {
name: string;
color: string;
}
interface Book {
price: number;
}
const user: User = { name: "a", age: 10};
const car: Car = { name: "bmw", color: "red"};
const book: Book = { price: 3000};
function showName<T>(data:T): string {
return data.name // 에러발생! Book에는 name이 없기 때문이다.
}
////
function showName<T extends {name:string}>(data:T): string {
return data.name // 이렇게 바꿔주면 name이 string인 형태를 확장한 형태이다라고 알려준다.
}
showName(user);
showName(car);
showName(book);