패스트캠퍼스 데브캠프

김민태의 데브캠프 2기 - generic

vitamin3000 2024. 11. 11. 12:28

이번시간에는 generic에 대해 알아보자.

 

우선, 하나에 선언된 배열에 숫자, 문자열, bool 등 다양한 자료형을 넣어 값을 반환받고자 한다면 

다음과 같이 union 타입으로 선언하여 각 자료형에 맞게 값을 반환할 것이다.

 

function getArrayLength(arr : number[] | string[] | boolean[]): number{
    return arr.length;
}

const array1 = [1, 2, 3];
const array2 = ["a", "b", "c"];
const array3 = [true, false, true];
getArrayLength(array1);
getArrayLength(array2);
getArrayLength(array3);

 

하지만 위의 코드와 같이 작성한다면, 새로운 자료형이 생길 때 마다 union의 값으로 추가해줘야 한다.

generic으로 더 깔끔하고, 효율적이게 바꿔보자

<> 안에 값을 설정해주면 되는데 보통 T를 사용하고, 예시는 다음과 같다.

 

function getArrayLength<T>(arr: T[]): number{
    return arr.length;
}
const array1 = [1, 2, 3];
const array2 = ["a", "b", "c"];
const array3 = [true, false, true];
getArrayLength<number>(array1);
getArrayLength<string>(array2);
getArrayLength<boolean>(array3);

 

다음은, option에서, any를 사용하는 대신, typescript답게 generic을 사용하는 방법이다.

 

interface Vehice<T>{
    name: string;
    color: string;
    option: T;
}

const car: Vehice<{ price: number}> = {
    name: 'Car',
    color: 'red',
    option: {
        price: 1000
    }
}

const bike: Vehice<boolean> = {
    name: 'Bike',
    color: 'green',
    option: true
}

 

 

더 다양한 예시이다.

 

const makeArr = <T, Y> (x: T, y : Y): [T, Y] => {
    return [x,y];
}

const array = makeArr<number, number>(4, 5);
const array = makeArr<string, string>("a", "b");

const makeArr1 = <T, Y = string> (x: T, y : Y): [T, Y] => {
    return [x,y];
}
const array = makeArr1<string>("a", "b");

const makeFullName = <T extends {firstName: string, lastName: string}> (obj: T) => {
    return {
        ...obj,
        fullName: obj.firstName + " "+ obj.lastName
    }
}

makeFullName({firstName: "john", lastName : "Doe", location: 'Seoul'})
makeFullName({firstName: "john", lastName : "Doe", hello: 'world'})

 

 

마지막으로  React에서 Generic을 사용하는 방법이다

 

interface Props {
    name: string;
}

const REactComponent: RecordingState.FC<Props> = ({ name}) => {
    return <div> {name}</div>
}

// useState에서의 방법 
const [state] = useSatate<{name: string | null}>({name: ""});