타입 변수 응용하기 - 제네릭

사례1

function swap<T, U>(a: T, b: U){
    return [b, a];
}

const [a, b] = swap('1', 2);

사례2

function returnFirstValue<T>(data: [T, ...unknown[]]){ // T 타입 다음부턴 알필요 없어서 rest파라미터 형식으로 unknown[]써줌
    return data[0];
}

let num = returnFirstValue([0, 1, 2]);
// 0

let str = returnFirstValue([1, "hello", "mynameis"]);
// 1

사례3

// length가 number인 프로퍼티를 가지고 있는 객체를 확장 (무조건 length를 가지고 있어야함)
function getLength<T extends { length: number }>(data:T){
    return data.length;
}

let var1 = getLength([1, 2, 3]); // 3

let var2 = getLength("12345"); // 5

let var3 = getLength({ length: 10}); // 10

// let var4 = getLength(10); -> 얘는 length를 가지고 있지 않아서 허용 X