맵드 타입 - 타입 조작하기

/**
 * 맵드 타입 (객체 타입을 조작함)  활용도 높고 실무에서 잘 쓰임
 * -> 인터페이스에서는 쓸 수 없음
 */

interface User {
    id: number;
    name: string;
    age: number;
}

type PartialUser = {
    // key가 id or name or age일 수 있다.
    [key in 'id' | 'name' | 'age']: User[key];
};

type BooleanUser = {
    [key in keyof User]: boolean
}

type ReadonlyUser = {
    readonly [key in keyof User]: User[key];
}

// 한명의 유저 정보를 불러오는 기능

function fetchUser(): ReadonlyUser{
    // ... 기능
    return {
        id: 1,
        name: "박정수",
        age: 26,
    };
}

const user = fetchUser();
// user.id = 1; 맵드 타입으로 readonly 사용해서 수정 안됨

// 한명의 유저 정보를 수정하는 기능
function updateUser(user: User){
    // .... 수정하는 기능
}

updateUser({
    id: 1,
    name: "박정수",
    age: 25,
})