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..f818f97 --- /dev/null +++ b/src/lesson5/easy3.ts @@ -0,0 +1,13 @@ +// Задание первого уровня 3 +// Есть общая функция omit которая удаляет поле из объекта и возвращает его без этого поля +// Нужно заменить FIXME на соответствующий тип + +type FIXME = Omit; + +export const omit = , K extends keyof T>( + obj: T, + keyToOmit: K, +): FIXME => { + const { [keyToOmit]: _, ...withoutKey } = obj; + return withoutKey; +}; 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', + );