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
69 changes: 42 additions & 27 deletions src/task_1/index.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,53 @@
/** Задача 1
/** Задача 1
* Требуется описать типы FooType и BarType так, чтобы код,
* который написан в функции logObj компилировался и исполнялся корректно
*/
*/

type FooType = unknown;
type BarType = unknown;
type FooType = {
stringProp: string;
numberProp: number;
barObject: BarType;
};

type BarType = {
stringsArrayProp: [string, string, string];
numbersOrDatesArrayProp: Array<object | number>;
functionProp: (boolean) => void;
};

export const fooObjects: FooType[] = [
{
stringProp: 'firstFoo',
numberProp: 2077,
barObject: {
stringsArrayProp: ['barString1', 'barString2', 'barString3'],
numbersOrDatesArrayProp: [new Date(), 100500, new Date(2077), 2020],
functionProp: (flag: boolean) => console.log(!flag),
}
{
stringProp: "firstFoo",
numberProp: 2077,
barObject: {
stringsArrayProp: ["barString1", "barString2", "barString3"],
numbersOrDatesArrayProp: [new Date(), 100500, new Date(2077), 2020],
functionProp: (flag: boolean) => console.log(!flag),
},
{
stringProp: 'secondFoo',
numberProp: 2020,
barObject: {
stringsArrayProp: ['barString1', 'barString2', 'barString3'],
numbersOrDatesArrayProp: [new Date(2077), 2020, new Date(), 100500],
functionProp: (flag: boolean) => console.log(flag),
}
},
{
stringProp: "secondFoo",
numberProp: 2020,
barObject: {
stringsArrayProp: ["barString1", "barString2", "barString3"],
numbersOrDatesArrayProp: [new Date(2077), 2020, new Date(), 100500],
functionProp: (flag: boolean) => console.log(flag),
},
},
];

function logObj(fooObject: FooType) {
console.log(`stringProp -- ${fooObject.stringProp}`);
console.log(`numberProp -- ${fooObject.numberProp}`)
console.log(`barObject.stringsArrayProp -- ${fooObject.barObject.stringsArrayProp}`)
console.log(`barObject.numbersOrDatesArrayProp -- ${fooObject.barObject.numbersOrDatesArrayProp}`)
console.log(`barObject.functionProp -- ${fooObject.barObject.functionProp(true)}`)
console.log(`stringProp -- ${fooObject.stringProp}`);
console.log(`numberProp -- ${fooObject.numberProp}`);
console.log(
`barObject.stringsArrayProp -- ${fooObject.barObject.stringsArrayProp}`
);
console.log(
`barObject.numbersOrDatesArrayProp -- ${fooObject.barObject.numbersOrDatesArrayProp}`
);
console.log(
`barObject.functionProp -- ${fooObject.barObject.functionProp(true)}`
);
}
fooObjects.forEach(logObj);

fooObjects.forEach(logObj);
100 changes: 61 additions & 39 deletions src/task_2/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,76 +3,98 @@
* массив с объектами 3х типов
* наименование типа
* возврщать массив с объектами, которые имеют тип, указанный во втором аргументе
*/
*/

enum System {
Linux = 0,
Window = 1,
MacOS = 2,
Linux = 0,
Window = 1,
MacOS = 2,
}

type FirstType = {
prop1: string,
prop2: boolean,
}
prop1: string;
prop2: boolean;
};

type SecondType = {
prop1: typeof undefined,
prop2: () => Date,
}
prop1: typeof undefined;
prop2: () => Date;
};

type ThirdType = {
prop1: string,
prop2: boolean,
prop3: System,
}
prop1: string;
prop2: boolean;
prop3: System;
};

const obj1: FirstType = {
prop1: "Привет, РТФ!",
prop2: false,
prop1: "Привет, РТФ!",
prop2: false,
};

const obj2: FirstType = {
prop1: "Привет, УрФУ!",
prop2: true,
prop1: "Привет, УрФУ!",
prop2: true,
};

const obj3: FirstType = {
prop1: "Привет, мир!",
prop2: true,
prop1: "Привет, мир!",
prop2: true,
};

const obj4: SecondType = {
prop1: undefined,
prop2: () => {
return new Date();
}
prop1: undefined,
prop2: () => {
return new Date();
},
};

const obj5: SecondType = {
prop1: undefined,
prop2: () => {
return new Date(2021, 3, 1);
}
prop1: undefined,
prop2: () => {
return new Date(2021, 3, 1);
},
};

const obj6: ThirdType = {
prop1: "Cats",
prop2: true,
prop3: System.Linux
prop1: "Cats",
prop2: true,
prop3: System.Linux,
};

const obj7: ThirdType = {
prop1: "Dogs",
prop2: true,
prop3: System.MacOS
prop1: "Dogs",
prop2: true,
prop3: System.MacOS,
};

const array = [obj1, obj2, obj3, obj4, obj5, obj6, obj7];

function filter(array: Array<FirstType | SecondType | ThirdType>, type: string) {
function filter(
array: Array<FirstType | SecondType | ThirdType>,
type: string
) {
return array.filter((item) => {
if (
typeof item.prop2 === "boolean" &&
typeof item.prop1 === "string" &&
type === "FirstType" &&
Object.keys(item).length === 2
) {
console.log(item);
return item;
}
if (typeof item.prop1 === typeof undefined && type === "SecondType") {
console.log(item);
return item;
}
if (Object.keys(item).length === 3) {
console.log(item);
return item;
}
});
}

filter(array, 'FirstType');
filter(array, 'SecondType');
filter(array, 'ThirdType');
filter(array, "FirstType");
filter(array, "SecondType");
filter(array, "ThirdType");
16 changes: 11 additions & 5 deletions src/task_3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@
* 2 - принимает 2 аргумента: x, y оба типа number и возвращает тип number
* использовать тип any для типизации параметров запрещено
* функция должна возвращать сумму двух аргументов
*/
function add(x: string, y: string): string;
function add(x: number, y: number): number;
*/
function add(x: string, y: string): string {
console.log(x + y);
return x + y;
}
function add1(x: number, y: number): number {
console.log(x + y);
return x + y;
}

add('20', '21'); //2021
add(20, 21); //41
add("20", "21"); //2021
add1(20, 21); //41
121 changes: 115 additions & 6 deletions src/task_4/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,122 @@
* Разобраться и описать в чём заключается разница между IFoo и FooType
* (фактически нужно описать в чём разница между type и interface)
* + к карме, если приведете примеры
*/
*/
interface IFoo {
a: number
b: string
a: number;
b: string;
}

type FooType = {
a: number
b: string
a: number;
b: string;
};

//В отличие от объявления интерфейса, которое всегда представляет именованный тип объекта, применение ключевого слова type позволяет задать псевдоним для любой разновидности типа, включая примитивные типы, типы-объединения и типы-пересечения.

// При использовании ключевого слова type вместо ключевого слова interface теряются следующие возможности:

// Интерфейс может быть использован в выражении extends или implements, а псевдоним для литерала объектного типа — нет.
// Интерфейс может иметь несколько объединённых объявлений, а при использовании ключевого слова type эта возможность не доступна.

// 1
//Оба могут использоваться для описания формы объекта или сигнатуры функции. Но синтаксис отличается.

interface Point {
x: number;
y: number;
}

interface SetPoint {
(x: number, y: number): void;
}

// type Point = {
// x: number;
// y: number;
// };

// type SetPoint = (x: number, y: number) => void;

// 2
// В отличие от интерфейса, псевдоним типа также может использоваться для других типов, таких как примитивы, объединения и кортежи.
// primitive
type Name = string;

// object
type PartialPointX = { x: number };
type PartialPointY = { y: number };

// union
type PartialPoint = PartialPointX | PartialPointY;

// tuple
type Data = [number, string];

// 3 Extend - расширение
// Оба могут быть расширены, но опять же, синтаксис отличается. Кроме того, обратите внимание, что интерфейс и псевдоним типа не исключают друг друга. Интерфейс может расширять псевдоним типа и наоборот.

// Interface extends interface
interface PartialPointX2 {
x: number;
}
interface Point extends PartialPointX2 {
y: number;
}

// Type alias extends type alias
type PartialPointX3 = { x: number };
type Point3 = PartialPointX3 & { y: number };

// Interface extends type alias
type PartialPointX4 = { x: number };
interface Point extends PartialPointX {
y: number;
}

// Type alias extends interface
interface PartialPointX5 {
x: number;
}
type Point11 = PartialPointX5 & { y: number };

// 4 Implements
interface Point {
x: number;
y: number;
}

class SomePoint implements Point {
x = 1;
y = 2;
}

type Point2 = {
x: number;
y: number;
};

class SomePoint2 implements Point2 {
x = 1;
y = 2;
}

type PartialPoint2 = { x: number } | { y: number };

// FIXME: can not implement a union type
// class SomePartialPoint implements PartialPoint2 {
// x = 1;
// y = 2;
// }

// 5 Объединение деклараций
// В отличие от псевдонима типа, интерфейс может быть определен несколько раз и будет рассматриваться как единый интерфейс (с объединенными членами всех объявлений).

interface Point {
x: number;
}
interface Point {
y: number;
}

const point: Point = { x: 1, y: 2 };
Loading