아래와 같은 배열의 길이를 반환하는 함수가 있다고 가정하자.
function getSize(arr):number {
return arr.length
}
이때, getSize 함수의 파라미터인 arr에는 아래처럼 여러가지 데이터 형태를 요소로 가지는 배열이 들어갈 수 있다.
[1, 2, 3]
["a", "b", "c"]
[true, false, false]
제네릭을 활용하여 getSize 함수의 arr의 파라미터를 유동적으로 지정하는 것이 가능하다.
function getSize<T>(arr:T[]):number {
return arr.length
}
이제 다양한 데이터 형태를 요소로 가지는 배열을 이용하여 getSize 함수를 호출하는 것이 가능하다.
const arr1 = [1, 2, 3];
getSize<number>(arr1)
const arr2 = ["a", "b", "c"]
getSize<string>(arr2)
interface Mobile<T> {
name:string
price:number
option:T
}
const m1: Mobile<object> = {
name: "s21",
price: 3000,
option: {
color:'red',
coupon: false,
}
}
const m2: Mobile<string> = {
name: "s20",
price:900,
option: "good"
}
interface User {
name: string;
age: number;
}
interface Car {
name: string;
color: string;
}
function showName<T>(data:T):string {
return data.name
}
function showName<T extends { name: string }>(data:T):string {
return data.name
}
이와 같이 인터페이스를 확장하여 제네릭을 정의하였고, 이제 data 객체에는 name 속성이 반드시 존재한다는 것을 명시하는 것이 가능하다.