Jieunny의 블로그

[TS] Exercises 1~3 본문

Study/TypeScript

[TS] Exercises 1~3

Jieunny 2023. 7. 18. 18:13

타입스크립트에 대한 감을 잃어버린 것 같아서 연습문제를 꾸준히 풀어보려고 한다. 💪

 

🔗 연습문제 링크

 

TypeScript Exercises

A set of interactive TypeScript exercises

typescript-exercises.github.io

 

exercises1

📌 데이터가 주어지면, User 인터페이스를 정의하고 사용해라.

export interface User {
    name: string;
    age: number;
    occupation: string;
}

// type을 사용해도 된다.

export const users: User[] = [
    {
        name: 'Max Mustermann',
        age: 25,
        occupation: 'Chimney sweep'
    },
    {
        name: 'Kate Müller',
        age: 23,
        occupation: 'Astronaut'
    }
];

export function logPerson(user: User) {
    console.log(` - ${user.name}, ${user.age}`);
}

console.log('Users:');
users.forEach(logPerson);

💡 users 배열을 보고 User 객체의 속성 타입을 정의해주는 문제다.

인터페이스는 객체의 구조를 정의하는 데 사용한다.

그럼 type과 interface의 차이는 뭘까?

  type interface
타입 선언 모든 타입 객체
확장 불가능 가능

📚 참고 : https://tecoble.techcourse.co.kr/post/2022-11-07-typeAlias-interface/

 

exercises2

📌 Person 타입이 없으므로 정의하고 사용해라. 모든 TS 오류를 해결하기 위해 person 배열과 logPerson 함수에서 사용해라.

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

interface Admin {
    name: string;
    age: number;
    role: string;
}

export type Person = User | Admin;

export const persons: Person[] /* <- Person[] */ = [
    {
        name: 'Max Mustermann',
        age: 25,
        occupation: 'Chimney sweep'
    },
    {
        name: 'Jane Doe',
        age: 32,
        role: 'Administrator'
    },
    {
        name: 'Kate Müller',
        age: 23,
        occupation: 'Astronaut'
    },
    {
        name: 'Bruce Willis',
        age: 64,
        role: 'World saver'
    }
];

export function logPerson(user: Person) {
    console.log(` - ${user.name}, ${user.age}`);
}

persons.forEach(logPerson);

💡 persons 배열에 occupation 과 role 속성이 모두 있으므로 유니온 타입을 이용해서 User와 Admin이 모두 올 수 있게 선언한다.

persons의 모든 객체(Person 타입)가 logPerson 함수의 파라미터로 들어가므로 user의 타입도 Person으로 바꿔주어야 한다.

 

exercises3

📌 logPerson 함수의 타입 오류를 수정해라.
logPerson 함수는 User 및 Admin을 모두 수락해야 하며 입력에 따라 관련 정보(occupation for User & role for Admin)를 출력해야 합니다.

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

interface Admin {
    name: string;
    age: number;
    role: string;
}

export type Person = User | Admin;

export const persons: Person[] = [
    {
        name: 'Max Mustermann',
        age: 25,
        occupation: 'Chimney sweep'
    },
    {
        name: 'Jane Doe',
        age: 32,
        role: 'Administrator'
    },
    {
        name: 'Kate Müller',
        age: 23,
        occupation: 'Astronaut'
    },
    {
        name: 'Bruce Willis',
        age: 64,
        role: 'World saver'
    }
];

export function logPerson(person: Person) {
    let additionalInformation: string;
    if ("role" in person) {
        additionalInformation = person.role;
    } else {
        additionalInformation = person.occupation;
    }
    console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`);
}

persons.forEach(logPerson);

💡 Person 타입이 User와 Admin 중에 하나가 가능하게 선언되어 있는데, person.role 이라고 하면 User에는 없는 속성이기 때문에 에러가 난다. role 속성이 있는지 확인하려면 'in' 연산자를 사용해야 한다.

'Study > TypeScript' 카테고리의 다른 글

[TS] Exercises5  (0) 2023.07.20
[TS] Exercises 4  (0) 2023.07.19
[TS] 함수 조합의 원리와 응용  (0) 2023.02.09
[TS] Promise와 async/await 구문  (0) 2023.02.06
[TS] 반복기와 생성기  (0) 2023.02.03