Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions vinhnx/ex1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export interface IUser {
name: string;
age: number;
occupation: string
};

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

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

console.log('Users:');
users.forEach(logPerson);
42 changes: 42 additions & 0 deletions vinhnx/ex2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
interface IUser {
name: string;
age: number;
occupation: string;
}

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

export type TPerson = IUser | IAdmin;

export const persons: TPerson[] = [
{
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: TPerson) {
console.log(` - ${user.name}, ${user.age}`);
}

persons.forEach(logPerson);
50 changes: 50 additions & 0 deletions vinhnx/ex3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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);
52 changes: 52 additions & 0 deletions vinhnx/ex4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
interface IUser {
type: 'user';
name: string;
age: number;
occupation: string;
}

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

export type TPerson = IUser | IAdmin;

export const persons: TPerson[] = [
{ 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' }
];

export function isAdmin(person: TPerson) {
return person.type === 'admin';
}

export function isUser(person: TPerson) {
return person.type === 'user';
}

export function logPerson(person: TPerson) {
let additionalInformation: string = '';

if (isAdmin(person)) {
additionalInformation = (person as IAdmin).role;
}

if (isUser(person)) {
additionalInformation = (person as IUser).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);
86 changes: 86 additions & 0 deletions vinhnx/ex5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
interface User {
type: 'user';
name: string;
age: number;
occupation: string;
}

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

export type Person = User | Admin;

type TCriteria = {
[id in keyof User]?: User[keyof User];
};

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: 'user',
name: 'Wilson',
age: 23,
occupation: 'Ball'
},
{
type: 'admin',
name: 'Agent Smith',
age: 23,
role: 'Administrator'
}
];

export const isAdmin = (person: Person): person is Admin => person.type === 'admin';
export const isUser = (person: Person): person is User => person.type === 'user';

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

export function filterUsers(persons: Person[], criteria: TCriteria): User[] {
return persons.filter(isUser).filter((user) => {
const criteriaKeys = Object.keys(criteria) as (keyof User)[];

return criteriaKeys.every((fieldName) => {
return user[fieldName] === criteria[fieldName];
});
});
}

console.log('Users of age 23:');

filterUsers(
persons,
{
age: 23
}
).forEach(logPerson);
56 changes: 56 additions & 0 deletions vinhnx/ex6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
interface User {
type: 'user';
name: string;
age: number;
occupation: string;
}

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

export type Person = User | Admin;

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: 'user', name: 'Wilson', age: 23, occupation: 'Ball' },
{ type: 'admin', name: 'Agent Smith', age: 23, role: 'Anti-virus engineer' }
];

export function logPerson(person: Person) {
console.log(
` - ${person.name}, ${person.age}, ${person.type === 'admin' ? person.role : person.occupation}`
);
}

const getObjectKeys = <T>(obj: T) => Object.keys(obj as keyof T) as (keyof T)[];

export function filterPersons(persons: Person[], personType: User['type'], criteria: Partial<Omit<User, 'type'>>): User[];
export function filterPersons(persons: Person[], personType: Admin['type'], criteria: Partial<Omit<Admin, 'type'>>): Admin[];
export function filterPersons(persons: Person[], personType: Person['type'], criteria: Partial<Person>): Person[] {
return persons
.filter((person) => person.type === personType)
.filter((person) => {
let criteriaKeys = getObjectKeys(criteria);
return criteriaKeys.every((fieldName) => {
return person[fieldName] === criteria[fieldName];
});
});
}

export const usersOfAge23 = filterPersons(persons, 'user', { age: 23 });
export const adminsOfAge23 = filterPersons(persons, 'admin', { age: 23 });

console.log('Users of age 23:');
usersOfAge23.forEach(logPerson);

console.log();

console.log('Admins of age 23:');
adminsOfAge23.forEach(logPerson);
Loading