{"id":19371466,"url":"https://github.com/ruwiseturtle/goit-typescript-hw-02","last_synced_at":"2025-10-10T17:47:04.140Z","repository":{"id":206924222,"uuid":"717200999","full_name":"Ruwiseturtle/goit-typescript-hw-02","owner":"Ruwiseturtle","description":null,"archived":false,"fork":false,"pushed_at":"2023-11-14T15:10:42.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-07T00:39:59.516Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ruwiseturtle.png","metadata":{"files":{"readme":"README-EN.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-10T19:46:10.000Z","updated_at":"2023-11-10T19:46:16.000Z","dependencies_parsed_at":"2025-01-07T00:39:59.295Z","dependency_job_id":null,"html_url":"https://github.com/Ruwiseturtle/goit-typescript-hw-02","commit_stats":null,"previous_names":["ruwiseturtle/goit-typescript-hw-02"],"tags_count":0,"template":false,"template_full_name":"goitacademy/typescript-homework-module-2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ruwiseturtle%2Fgoit-typescript-hw-02","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ruwiseturtle%2Fgoit-typescript-hw-02/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ruwiseturtle%2Fgoit-typescript-hw-02/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ruwiseturtle%2Fgoit-typescript-hw-02/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ruwiseturtle","download_url":"https://codeload.github.com/Ruwiseturtle/goit-typescript-hw-02/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240495082,"owners_count":19810546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T08:18:31.817Z","updated_at":"2025-10-10T17:46:58.091Z","avatar_url":"https://github.com/Ruwiseturtle.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Базові типи\n\nМетою цього домашнього завдання є закріплення ваших навичок роботи з базовими типами TypeScript. Ви будете працювати з типами, такими як number, string, boolean, null, undefined, unknown, any, а також кортежами, переліками (enum) та об'єднаннями типів.\n\nВ кінці домашнього завдання ви також попрактикуєтеся у створенні свого типу на основі наявних об'єктів. Це допоможе вам краще зрозуміти, як TypeScript може бути використаний для забезпечення типової безпеки ваших даних та підвищення якості вашого коду.\n\n\n### Завдання 1\nЄ наступний JavaScript код:\n\n```ts\nlet age = 50;\nlet name = 'Max';\nlet toggle = true;\nlet empty = null;\nlet notInitialize;\nlet callback = (a) =\u003e { return 100 + a };\n```\n\nПеретворіть цей код на TypeScript, вказавши відповідні типи для всіх змінних.\n\n### Завдання 2\nJavaScript змінна може зберігати значення будь-якого типу:\n```ts\nlet anything = -20;\nanything = 'Text';\nanything = {};\n```\nЯкий тип ви надаєте змінній anything в TypeScript, щоб зберегти її гнучкість?\n\n### Завдання 3\nУ TypeScript тип unknown дозволяє нам зберігати будь-які значення, але ми можемо привласнити unknown змінну безпосередньо інший змінної, якщо ми впевнені у її типі. У вас є наступний код:\n```ts\nlet some:unknown;\nsome = 'Text';\nlet str: string;\nstr = some;\n```\nЩо потрібно виправити в цьому коді, щоб він став правильним та безпечним?\n\n### Завдання 4\nУ вас є наступний JavaScript масив:\n```ts\nlet person = ['Max', 21];\n```\nЯк переписати його в TypeScript, використовуючи концепцію кортежів, щоб гарантувати, що перший елемент завжди буде рядком, а другий числом?\n\n### Завдання 5\nЯк ви визначите змінну в TypeScript, яка може приймати рядок або число (union type)? І так само визначте змінну, яка може приймати тільки одне з двох рядкових значень: 'enable' або 'disable' (literal type)?\n\n### Завдання 6\nУ вас є такі функції JavaScript:\n```ts\nfunction showMessage(message) {\n  console.log(message);\n}\n\nfunction calc(num1, num2) {\n  return num1 + num2;\n}\n\nfunction customError() {\n  throw new Error('Error');\n}\n```\nЯк ви вкажете типи для аргументів і значень цих функцій, що повертаються?\n\n### Завдання 7\nСтворіть функцію (isWeekend), яка приймає день тижня (з вашого enum) і повертає boolean значення, що вказує, чи це день робочий чи вихідний.\n\n### Завдання 8\nСтворіть тип \"Gender\", використовуючи union type, який може містити значення \"male\", \"female\". Створіть змінну myGender цього типу.\n\n### Завдання 9\nУ вас є два об'єкти:\n```ts\nconst page1 = {\n  title: 'The awesome page',\n  likes: 100,\n  accounts: ['Max', 'Anton', 'Nikita'],\n  status: 'open',\n  details: {\n    createAt: new Date('2021-01-01'),\n    updateAt: new Date('2021-05-01'),\n  }\n}\n\nconst page2 = {\n  title: 'Python or Js',\n  likes: 5,\n  accounts: ['Alex'],\n  status: 'close',\n}\n```\nСтворіть новий тип даних, який підходить для цих двох об'єктів.\n\n# Generic\nМета цього завдання - допомогти вам зрозуміти та застосувати generics у TypeScript. Ви працюватимете з функціями, що повертають проміси, використовувати вбудований тип Pick, об'єднувати об'єкти за допомогою generics, а також вирішувати проблеми типів у класах.\n\n### Завдання 1\nЄ функція getPromise(), яка повертає проміс, що дозволяється в масив, що містить рядки та числа. Доповніть цю функцію, використовуючи generics, щоб вона повертала правильний тип.\n```ts\nfunction getPromise () {\n  return new Promise((resolve) =\u003e {\n    resolve(['Text', 50]);\n  });\n}\n\ngetPromise()\n.then((data) =\u003e {\n  console.log(data);\n});\n```\n### Завдання 2\nУ вас є тип AllType. Існує функція compare, яка приймає два об'єкти. Ці об'єкти містять поля AllType. Ваше завдання – використовувати Pick та generics для вказівки, що поля цих об'єктів належать AllType. Функція compare повинна повертати AllType.\n```ts\ntype AllType = {\n  name: string;\n  position: number;\n  color: string;\n  weight: number\n}\n\nfunction compare (top, bottom): AllType {\n  return {\n    name: top.name,\n    color: top.color,\n    position: bottom.position,\n    weight: bottom.weight,\n  }\n}\n```\n### Завдання 3\nУ вас є функція merge, яка поєднує два об'єкти. Використовуйте generics, щоб вказати, що ці об'єкти можуть бути будь-якого типу.\n```ts\nfunction merge (objA, objB) {\n  return Object.assign(objA, objB);\n}\n```\n### Завдання 4\nВикористовуйте generics та інтерфейси, щоб виправити помилку в наступних класах:\n```ts\nclass Component {\n  constructor (public props:T) {\n\n  }\n}\n\nclass Page extends Component {\n  pageInfo () {\n    console.log(this.props.title);\n  }\n}\n```\n### Завдання 5\nВам потрібно реалізувати інтерфейс KeyValuePair, який описує пару ключ-значення. Використовуйте generics, щоб цей інтерфейс міг працювати з будь-якими типами ключів та значень.\n```ts\ninterface KeyValuePair {\n  key;\n  value;\n}\n```\n### Завдання 6\nВи маєте форму реєстрації користувачів. Іноді потрібно попередньо заповнити форму даними користувача для оновлення його профілю. Однак вам не завжди потрібно заповнити всі поля. Наприклад, користувач може хотіти оновити лише свій email та пароль, залишивши ім'я та прізвище без змін.\n\nВиправте тип у аргументі функції так, щоб не було помилок типу.\n```ts\ntype User = {\n  name: string;\n  surname: string;\n  email: string;\n  password: string;\n}\n\nfunction createOrUpdateUser(initialValues: User) {\n  // Оновлення користувача\n}\n\ncreateOrUpdateUser({ email: 'user@mail.com', password: 'password123' });\n```\n### Завдання 7\nУ вас є перелік UserRole, який використовується для класифікації користувачів у вашому додатку. Ви хочете створити об'єкт RoleDescription, який зіставлятиме кожну роль користувача з її описом.\n```ts\nexport enum UserRole {\n  admin = 'admin',\n  editor = 'editor',\n  guest = 'guest',\n}\n\n// Замініть наступний код на версію за допомогою Record\nconst RoleDescription = {\n  admin: 'Admin User',\n  editor: 'Editor User',\n  guest: 'Guest User',\n};\n```\n### Завдання 8\nУ вас є тип Form, який містить інформацію про форму, включаючи поле errors. Ви хочете створити новий тип Params, який включає всі поля з Form, крім errors.\n```ts\ntype Errors = {\n  email?: string[];\n  firstName?: string[];\n  lastName?: string[];\n  phone?: string[];\n};\n\ntype Form = {\n  email: string | null;\n  firstName: string | null;\n  lastName: string | null;\n  phone: string | null;\n  errors: Errors;\n};\n\n// Реалізуйте Params так, щоб унеможливити поле 'errors' з типу Form\ntype Params = Form;\n``","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruwiseturtle%2Fgoit-typescript-hw-02","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruwiseturtle%2Fgoit-typescript-hw-02","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruwiseturtle%2Fgoit-typescript-hw-02/lists"}