From 9f24574931fd944143c5ef7160c1aca2836442ca Mon Sep 17 00:00:00 2001 From: Maxim Kremnev Date: Fri, 7 Aug 2020 11:02:19 +0300 Subject: [PATCH 1/4] Lesson 5: formation type for lesson --- src/lesson5/easy1.ts | 24 ++++++++++++++++++++++++ src/lesson5/easy2.ts | 38 ++++++++++++++++++++++++++++++++++++++ src/lesson5/easy3.ts | 15 +++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/lesson5/easy1.ts create mode 100644 src/lesson5/easy2.ts create mode 100644 src/lesson5/easy3.ts diff --git a/src/lesson5/easy1.ts b/src/lesson5/easy1.ts new file mode 100644 index 0000000..701023c --- /dev/null +++ b/src/lesson5/easy1.ts @@ -0,0 +1,24 @@ +// Задание первого уровня 1 +// В функцию приходит массив состояний заказа и фильтруется +// Нужно заменить FIXME на тип который вычисляется на освове OrderState +type FIXME = Exclude[]; + +const orderStates = [ + 'initial', + 'inWork', + 'buyingSupplies', + 'producing', + 'fullfilled', +] as const; + +type OrderState = typeof orderStates[number]; + +export const getUserOrderStates = (orderStates: OrderState[]): FIXME => { + const filteredStates = [] as FIXME; + orderStates.forEach((element) => { + if (element !== 'buyingSupplies' && element !== 'producing') { + filteredStates.push(element); + } + }); + return filteredStates; +}; diff --git a/src/lesson5/easy2.ts b/src/lesson5/easy2.ts new file mode 100644 index 0000000..b400e07 --- /dev/null +++ b/src/lesson5/easy2.ts @@ -0,0 +1,38 @@ +// Задание первого уровня 2 +// Есть объединение (юнион) типов заказов в различных состояниях +// Нужно заменить FIXME на тип который достанет из Order все возможные состояния (state) +type FIXME = Extract; + +type Order = + | { + state: 'initial'; + sum: number; + } + | { + state: 'inWork'; + sum: number; + workerId: number; + } + | { + state: 'buyingSupplies'; + sum: number; + workerId: number; + suppliesSum: number; + } + | { + state: 'producing'; + sum: number; + workerId: number; + suppliesSum: number; + produceEstimate: Date; + } + | { + state: 'fullfilled'; + sum: number; + workerId: number; + suppliesSum: number; + produceEstimate: Date; + fullfillmentDate: Date; + }; + +export const getOrderState = (order: Order): FIXME => order.state; diff --git a/src/lesson5/easy3.ts b/src/lesson5/easy3.ts new file mode 100644 index 0000000..87ca0ed --- /dev/null +++ b/src/lesson5/easy3.ts @@ -0,0 +1,15 @@ +// Задание первого уровня 3 +// Есть общая функция omit которая удаляет поле из объекта и возвращает его без этого поля +// Нужно заменить FIXME на соответствующий тип + +type FIXME = { + [key in any]: any; +}; + +export const omit = , K extends keyof T>( + obj: T, + keyToOmit: K, +): FIXME => { + const { [keyToOmit]: _, ...withoutKey } = obj; + return withoutKey; +}; From 2630af9aa18cf8e4c170e708ba595bec08e73bfe Mon Sep 17 00:00:00 2001 From: Maxim Kremnev Date: Tue, 15 Sep 2020 13:59:19 +0300 Subject: [PATCH 2/4] Editing easy3 with Omit --- src/lesson5/easy3.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lesson5/easy3.ts b/src/lesson5/easy3.ts index 87ca0ed..8a9a1d0 100644 --- a/src/lesson5/easy3.ts +++ b/src/lesson5/easy3.ts @@ -2,14 +2,12 @@ // Есть общая функция omit которая удаляет поле из объекта и возвращает его без этого поля // Нужно заменить FIXME на соответствующий тип -type FIXME = { - [key in any]: any; -}; +type FIXME = Omit; export const omit = , K extends keyof T>( obj: T, keyToOmit: K, -): FIXME => { +): FIXME => { const { [keyToOmit]: _, ...withoutKey } = obj; return withoutKey; }; From 37713f03e14200ce9e9c458e4cf618220b896093 Mon Sep 17 00:00:00 2001 From: Maxim Kremnev Date: Tue, 15 Sep 2020 14:03:14 +0300 Subject: [PATCH 3/4] Added latest files --- src/lesson5/hard.ts | 14 ++++++++++++ src/lesson5/medium1.ts | 48 ++++++++++++++++++++++++++++++++++++++++++ src/lesson5/medium2.ts | 13 ++++++++++++ src/lesson5/medium3.ts | 17 +++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/lesson5/hard.ts create mode 100644 src/lesson5/medium1.ts create mode 100644 src/lesson5/medium2.ts create mode 100644 src/lesson5/medium3.ts diff --git a/src/lesson5/hard.ts b/src/lesson5/hard.ts new file mode 100644 index 0000000..e84666c --- /dev/null +++ b/src/lesson5/hard.ts @@ -0,0 +1,14 @@ +type FIXME = any; + +// Это сложное (если не супер сложное) задание +// Задача состоит в том что написать калькулято для натуральных чисел, но только на типах! +// Ниже приведена заготовка +// Хочется поддержки сложения и вычитания, если хочется еще челленджа, то деление и умножение +// Из-за ограничений глубины вычислений поддержать все натуральные числа не получится, это нормально +type Equals = A extends B ? (B extends A ? 'success' : never) : never; + +type Add = FIXME; +type Subtract = FIXME; + +export type OnePlusOneTest = Equals, 2>; +export type TwoMinusOneTest = Equals, 1>; diff --git a/src/lesson5/medium1.ts b/src/lesson5/medium1.ts new file mode 100644 index 0000000..097c04f --- /dev/null +++ b/src/lesson5/medium1.ts @@ -0,0 +1,48 @@ +// Задание второго уровня 1 +// Есть объединение (юнион) типов заказов в различных состояниях +// и функция filterOnlyInitialAndInWorkOrder которая принимает заказы в любых состояниях +// А возвращает только initial и inWork +// Нужно заменить FIXME на правильный тип вычисленный на основе Order + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type FIXME = any; + +type Order = + | { + state: 'initial'; + sum: number; + } + | { + state: 'inWork'; + sum: number; + workerId: number; + } + | { + state: 'buyingSupplies'; + sum: number; + workerId: number; + suppliesSum: number; + } + | { + state: 'producing'; + sum: number; + workerId: number; + suppliesSum: number; + produceEstimate: Date; + } + | { + state: 'fullfilled'; + sum: number; + workerId: number; + suppliesSum: number; + produceEstimate: Date; + fullfillmentDate: Date; + }; + +export const filterOnlyInitialAndInWorkOrder = (order: Order): FIXME => { + if (order.state === 'initial' || order.state === 'inWork') { + return order; + } + + return null; +}; diff --git a/src/lesson5/medium2.ts b/src/lesson5/medium2.ts new file mode 100644 index 0000000..138b214 --- /dev/null +++ b/src/lesson5/medium2.ts @@ -0,0 +1,13 @@ +// Задание второго уровня 2 +// Есть функция которая достает из реакт компонента (любого, и Functional и Class) его defaultProps +// Нужно заменить FIXME на правильный тип + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type FIXME = any; + +// Hint: infer +export const getDefaultProps = ( + component: React.ComponentType, +): FIXME => { + return component.defaultProps; +}; diff --git a/src/lesson5/medium3.ts b/src/lesson5/medium3.ts new file mode 100644 index 0000000..81551f8 --- /dev/null +++ b/src/lesson5/medium3.ts @@ -0,0 +1,17 @@ +type FIXME = any; + +const orderStates = [ + 'initial', + 'inWork', + 'buyingSupplies', + 'producing', + 'fullfilled', +] as const; + +type OrderState = typeof orderStates[number]; + +// Hint: type guards +export const getUserOrderStates = (orderStates: OrderState[]): FIXME => + orderStates.filter( + (state) => state !== 'buyingSupplies' && state !== 'producing', + ); From 927ace2b9ac680269db6ea5a3c0c195d51eddb9a Mon Sep 17 00:00:00 2001 From: Maxim Kremnev Date: Tue, 15 Sep 2020 16:20:48 +0300 Subject: [PATCH 4/4] Editing easy3 with omit correctly --- src/lesson5/easy3.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lesson5/easy3.ts b/src/lesson5/easy3.ts index 8a9a1d0..f818f97 100644 --- a/src/lesson5/easy3.ts +++ b/src/lesson5/easy3.ts @@ -2,12 +2,12 @@ // Есть общая функция omit которая удаляет поле из объекта и возвращает его без этого поля // Нужно заменить FIXME на соответствующий тип -type FIXME = Omit; +type FIXME = Omit; export const omit = , K extends keyof T>( obj: T, keyToOmit: K, -): FIXME => { +): FIXME => { const { [keyToOmit]: _, ...withoutKey } = obj; return withoutKey; };