Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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 {
- name: string;
- age: number;
- occupation: string;
- }
- interface Admin {
- name: string;
- age: number;
- role: string;
- }
- type PowerUser = User & Admin;
- export type Person = User | Admin | PowerUser;
- 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' },
- {
- name: 'Nikki Stone',
- age: 45,
- role: 'Moderator',
- occupation: 'Cat groomer'
- }
- ];
- function isAdmin(person: Person): person is Admin {
- return !!Object.keys(person).find(x => x === "role")
- }
- function isUser(person: Person): person is User {
- return !!Object.keys(person).find(x => x === "occupation")
- }
- function isPowerUser(person: Person): person is PowerUser {
- return isAdmin(person) && isUser(person)
- }
- 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 if you are stuck:
- // https://www.typescriptlang.org/docs/handbook/utility-types.html
Advertisement
Add Comment
Please, Sign In to add comment