Skip to content
Open
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
24 changes: 24 additions & 0 deletions src/lesson5/easy1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Задание первого уровня 1
// В функцию приходит массив состояний заказа и фильтруется
// Нужно заменить FIXME на тип который вычисляется на освове OrderState
type FIXME = Exclude<OrderState, 'buyingSupplies' | 'producing'>[];

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;
};
38 changes: 38 additions & 0 deletions src/lesson5/easy2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Задание первого уровня 2
// Есть объединение (юнион) типов заказов в различных состояниях
// Нужно заменить FIXME на тип который достанет из Order все возможные состояния (state)
type FIXME = Extract<Order['state'], string>;

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;
13 changes: 13 additions & 0 deletions src/lesson5/easy3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Задание первого уровня 3
// Есть общая функция omit которая удаляет поле из объекта и возвращает его без этого поля
// Нужно заменить FIXME на соответствующий тип

type FIXME<T, K extends keyof T> = Omit<T, K>;

export const omit = <T extends Record<any, any>, K extends keyof T>(
obj: T,
keyToOmit: K,
): FIXME<T, K> => {
const { [keyToOmit]: _, ...withoutKey } = obj;
return withoutKey;
};
14 changes: 14 additions & 0 deletions src/lesson5/hard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
type FIXME = any;

// Это сложное (если не супер сложное) задание
// Задача состоит в том что написать калькулято для натуральных чисел, но только на типах!
// Ниже приведена заготовка
// Хочется поддержки сложения и вычитания, если хочется еще челленджа, то деление и умножение
// Из-за ограничений глубины вычислений поддержать все натуральные числа не получится, это нормально
type Equals<A, B> = A extends B ? (B extends A ? 'success' : never) : never;

type Add<A, B> = FIXME;
type Subtract<A, B> = FIXME;

export type OnePlusOneTest = Equals<Add<1, 1>, 2>;
export type TwoMinusOneTest = Equals<Subtract<2, 1>, 1>;
48 changes: 48 additions & 0 deletions src/lesson5/medium1.ts
Original file line number Diff line number Diff line change
@@ -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;
};
13 changes: 13 additions & 0 deletions src/lesson5/medium2.ts
Original file line number Diff line number Diff line change
@@ -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 = <T>(
component: React.ComponentType<T>,
): FIXME => {
return component.defaultProps;
};
17 changes: 17 additions & 0 deletions src/lesson5/medium3.ts
Original file line number Diff line number Diff line change
@@ -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',
);