-
Notifications
You must be signed in to change notification settings - Fork 1
/
generics.ts
94 lines (75 loc) · 2.78 KB
/
generics.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Generic Array ----------------------------------------------------
const myArr: MyArray<number> = [1,2,3];
// Generic - это как аргументы у функций
// MyArray принимает тип T и устанавливает ее в индекс-сигнатуру
interface MyArray<T> {
[N: number]: T
map<U>(fn: (el: T, index: number, arr: T[]) => U): U[]
}
let variable = myArr[1];
myArr.map((f, index, arr) => f + 1); // [2,3,4]
myArr.map((f) => `f +${f}`); // ['f+1','f+2'..]
[1,2,3].map((f, index, arr) => f + 1); // [2,3,4]
[1,2,3].map((f) => `f +${f}`); // ['f+1','f+2'..]
// Generic Function -------------------------------------------------
function identity(arg: any): any {
return arg
}
let result = identity(12); // с обнулением типизации результат всегда any
function identity1(arg) {
return arg
}
let result1 = identity1(12); // без указания типизации результат также any
// чтобы определять тип автоматически, вводим generic <T>
function identity2<T>(arg: T): T {
return arg
}
let result2 = identity2(123); // number
let result3 = identity2('1'); // string
// Generic extends Function -----------------------------------------
function getLen<T extends Array<any>>(arr: T): number {
return arr.length;
}
// function getLen<T>(arr: T): number {
// return arr.length; // property lenght doesn't exist for any type
// }
let arrLength = getLen([1,2,3]);
// интерфейс всегда начинается с I (венгерская нотация)
interface IValueWithType<T> {
type: string;
value: T
}
function withType<U>(arg: U): IValueWithType<U> {
return {
type: typeof arg,
value: arg
}
}
const result10 = withType(123);
// Встроенные generics ----------------------------------------------
// 1. Array
interface IExample<T> {
type: string;
value: T;
isEmpty?: boolean;
}
// 2. Omit (удаляет ключи из интерфейса)
const omittedObject1: Omit<IExample<string>, 'isEmpty'> = {
type: 'asd',
value: '123'
}
const omittedObject2: Omit<IExample<string>, 'isEmpty' |'value' > = {
type: 'asd'
}
// 3. Pick (выбирает ключи из интерфейса)
const pickedObject1: Pick<IExample<number>, 'isEmpty'> = {
isEmpty: true,
}
const pickedObject2: Pick<IExample<number>, 'isEmpty' |'value'> = {
isEmpty: true,
value: 123
}
// 4. Partial (делает все ключи из интерфейса необязательными)
// опасный тип, который может породить большое количество if-ов
const partialObject: Partial<IExample<object>> = {
}