Ex 8

๋ฌธ์ œ

/*

Intro:

    Project grew and we ended up in a situation with
    some users starting to have more influence.
    Therefore, we decided to create a new person type
    called PowerUser which is supposed to combine
    everything User and Admin have.

Exercise:

    Define type PowerUser which should have all fields
    from both User and Admin (except for type),
    and also have type 'powerUser' without duplicating
    all the fields in the code.

*/

interface User {
    type: 'user';
    name: string;
    age: number;
    occupation: string;
}

interface Admin {
    type: 'admin';
    name: string;
    age: number;
    role: string;
}

type PowerUser = unknown;

export type Person = User | Admin | PowerUser;

export const persons: Person[] = [
    { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' },
    { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' },
    { type: 'user', name: 'Kate Mรผller', age: 23, occupation: 'Astronaut' },
    { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' },
    {
        type: 'powerUser',
        name: 'Nikki Stone',
        age: 45,
        role: 'Moderator',
        occupation: 'Cat groomer'
    }
];

function isAdmin(person: Person): person is Admin {
    return person.type === 'admin';
}

function isUser(person: Person): person is User {
    return person.type === 'user';
}

function isPowerUser(person: Person): person is PowerUser {
    return person.type === 'powerUser';
}

export function logPerson(person: Person) {
    let additionalInformation: string = '';
    if (isAdmin(person)) {
        additionalInformation = person.role;
    }
    if (isUser(person)) {
        additionalInformation = person.occupation;
    }
    if (isPowerUser(person)) {
        additionalInformation = `${person.role}, ${person.occupation}`;
    }
    console.log(`${person.name}, ${person.age}, ${additionalInformation}`);
}

console.log('Admins:');
persons.filter(isAdmin).forEach(logPerson);

console.log();

console.log('Users:');
persons.filter(isUser).forEach(logPerson);

console.log();

console.log('Power users:');
persons.filter(isPowerUser).forEach(logPerson);

// In case you are stuck:
// https://www.typescriptlang.org/docs/handbook/utility-types.html
// https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types

ํ’€์ด

User์™€ Admin ํƒ€์ž…์„ ํ•ฉ์นœ PowerUser ํƒ€์ž…์„ ์ƒ์„ฑํ•ด ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ฒ˜์Œ์—๋Š” &๋ฅผ ํ™œ์šฉํ•ด๋ดค๋Š”๋ฐ

ํƒ€์ž… PowerUser์˜ ํ”„๋กœํผํ‹ฐ์ธ type = "powerUser"์—ฌ์•ผ ํ–ˆ๊ธฐ์— ์‹คํŒจํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด type์„ ์„ค์ •ํ•˜๊ณ , Pick์„ ํ™œ์šฉํ•ด User์™€ Admin์—์„œ ํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ•ฉ์„ฑํ–ˆ๋‹ค.

**

์ •๋‹ต์„ ๋ณด๋‹ˆ Pick์œผ๋กœ ์“ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์•ˆ ์“ฐ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์ด ๋” ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

์ฐธ๊ณ 

Pick<Type, 'property'> - ํƒ€์ž…์—์„œ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฝ‘์•„ ํƒ€์ž…์„ ๊ตฌ์„ฑํ•œ๋‹ค.

Omit<Type, 'property'> - ํƒ€์ž…์—์„œ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์šด ํƒ€์ž…์„ ๊ตฌ์„ฑํ•œ๋‹ค.

์ฐธ๊ณ 

Last updated

Was this helpful?