You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: modules/25-types/10-type-as-sets/description.ru.yml
+15-7Lines changed: 15 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -3,22 +3,28 @@
3
3
name: Типы как множества
4
4
theory: |
5
5
6
-
Что вообще такое тип данных? Чтобы ответить на этот вопрос, лучше начать с ответа на вопрос, что было до типов данных? Семейство языков, в котором нет типов данных, называется ассемблером. Эти языки работают напрямую с процессором и оперируют его регистрами. В регистрах хранятся значения, которые, с точки зрения языка, являются числами. А что закодировано за этим числом, должен определять сам программист, будь то строка или часть картинки.
6
+
В этом уроке мы познакомимся с типами данных и узнаем, чем они полезны для разработчика. Также мы поговорим про типы как про множества. Это позволит понимать принципы работы TypeScript.
7
+
8
+
## Типы данных
9
+
10
+
Семейство языков, в котором нет типов данных, называется ассемблером. Эти языки работают напрямую с процессором и оперируют его регистрами. В регистрах хранятся значения, которые с точки зрения языка являются числами. А что закодировано за этим числом, должен определять сам программист. Это может быть строка или часть картинки.
7
11
8
-
Главная проблема такого подхода — в отсутствии какой-либо безопасности. Программа никогда не выдаст ошибку, если мы случайно что-то сделаем со "строкой", чего с ней делать нельзя. С точки зрения процессора и языка программирования, строки нет — есть число, и мы выполняем над ним какие-то операции. В итоге программа работает всегда, но результат неверный. Представьте себе, какой уровень внимательности нужен, чтобы программировать в таком режиме.
12
+
Главная проблема такого подхода — отсутствие безопасности. Программа не выдаст ошибку, если мы случайно что-то сделаем со строкой, чего с ней делать нельзя. С точки зрения процессора и языка программирования, строки нет — есть число, и мы выполняем над ним какие-то операции. В итоге программа работает всегда, но результат неверный. В этом случае нужен высокий уровень внимательности, чтобы программировать в таком режиме.
9
13
10
-
Ситуацию исправило появление типов данных в высокоуровневых языках. Типы позволили выполнить две задачи:
14
+
Ситуация исправилась, когда появились типы данных в высокоуровневых языках. Они позволили выполнить две задачи:
11
15
12
16
* Описать и ограничить множество всех значений конкретного типа
13
17
* Определить операции, которые возможно выполнить с этим типом
14
18
15
-
Все это заложено в определении: Тип данных — это множество всех значений и набор допустимых операций над ними. Что нам это дает? Типобезопасность. Даже в динамическом языке, таком как JavaScript, мы получаем значительно более сильную безопасность, чем в ассемблере. В статическом же, таком как TypeScript, уровень проверки совместимости типов выходит на другой уровень.
19
+
**Тип данных** — это множество всех значений и набор допустимых операций над ними. Это обеспечивает типобезопасность. Даже в динамическом языке, например, в JavaScript, мы получаем более сильную безопасность, чем в ассемблере. В статическом TypeScript уровень проверки совместимости типов выходит на другой уровень.
20
+
21
+
<!-- TODO - автору: 1. Поймет ли студент, что значит "типобезопасность"? Если нет, стоит объяснить. 2. "В статическом TypeScript уровень проверки совместимости типов выходит на другой уровень" - звучит абстрактно. Что значит на новый уровень? В этом случае безопасность еще лучше? -->
16
22
17
23
## Множества
18
24
19
-
Обычно, когда говорят про определение типов, в первую очередь обращают внимание на вторую часть: "набор допустимых операций". А вот первая часть кажется более размытой: "набор допустимых значений". С одной стороны, это может быть ограничение числа по верхней и нижней границе, как в JavaScript. У нас есть `Number` для одного диапазона чисел и `BigInt` для другого, когда нужно работать с огромными числами. С другой, мы ведь говорим про множества.
25
+
Если говорить про типы данных, как про набор допустимых значений, то с одной стороны, это может быть ограничение числа по верхней и нижней границе. Например, так устроено в JavaScript. У нас есть `Number` для одного диапазона чисел и `BigInt` — для другого, когда нужно работать с огромными числами. С другой стороны, мы говорим про множества.
20
26
21
-
И вот этот взгляд на типы как на множества имеет огромную роль в нашем случае. Связано это с тем, что система типов языка TypeScript умеет комбинировать типы так, как это делается в обычных множествах. Например, мы можем объединить два множества типов, получив новый тип, в который входят все элементы первого множества (типа) и второго множества (типа). Так появляется Union Type:
27
+
Взгляд на типы как на множества играет важную роль. Это связано с тем, что система типов языка TypeScript умеет комбинировать типы так, как это делается в обычных множествах. Например, мы можем объединить два множества типов и получить новый тип, в который входят все элементы первого множества и второго множества. Так появляется Union Type:
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
30
38
31
-
Примерно таким же способом мы можем построить пересечение типов, расширение и сделать другие интересные штуки с типами. Кое-что мы рассмотрим дальше по курсу, но часть вещей останется за пределами. Но, что бы ни происходило дальше, важно перестроить свое мышление на операции с типами: это позволит значительно упростить понимание принципов работы TypeScript и вы сможете лучше запоминать, а иногда даже сами догадываться до определенного поведения.
39
+
Примерно таким же способом можно построить пересечение и расширение типов и сделать другие действия с типами. Некоторые из них мы рассмотрим в курсе, но часть вещей останется за пределами. Главное — нужно перестроить свое мышление на операции с типами. Так будет проще понимать принципы работы TypeScript и запоминать определенное поведение.
Copy file name to clipboardExpand all lines: modules/25-types/20-union-types/description.ru.yml
+17-9Lines changed: 17 additions & 9 deletions
Original file line number
Diff line number
Diff line change
@@ -3,17 +3,21 @@
3
3
name: Объединения (Union Types)
4
4
theory: |
5
5
6
-
Объединения типовиграют большую роль в TypeScript, они позволяют выразить обычную для JavaScript ситуацию, когда возвращаемое значение или аргумент функции могут быть различного типа. Например метод `String.prototype.at()` может возвращать значение типа `string`, либо `undefined`.
6
+
В этом уроке мы научмся работать с объединениями типов, которые играют большую роль в TypeScript. Они позволяют выразить обычную ситуацию для JavaScript, когда возвращаемое значение или аргумент функции могут быть различного типа. Например, метод `String.prototype.at()` может возвращать значение типа `string` либо `undefined`.
7
7
8
-
Объединение указывается с помощью оператора прямой черты `|`, по обе стороны которого располагаются типы. Давайте определим свой тип для функции `at`:
8
+
Объединение указывается с помощью оператора прямой черты `|`, по обе стороны которого располагаются типы.
9
+
10
+
Определим свой тип для функции `at`:
9
11
10
12
```typescript
11
13
type at = (str: string, position: number) => string | undefined;
12
14
```
13
15
14
-
С точки зрения теории множеств, операция union обозначает объединение. Когда мы объединяем несколько множеств, получается новое множество, в которое входят все элементы исходных множеств.
16
+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
17
+
18
+
С точки зрения теории множеств операция union обозначает объединение. Когда мы объединяем несколько множеств, получается новое множество, в которое входят все элементы исходных множеств.
15
19
16
-
Применительно к TypeScript это означает, что в результате мы получаем тип, обещающий содержать переменную одного из типов объединения. Так мы можем завести свой тип, под который попадают все строки **ИЛИ** числа:
20
+
В TypeScript это означает, что в результате мы получаем тип, который обещает содержать переменную одного из типов объединения. Так мы можем завести свой тип, под который попадают все строки **ИЛИ** числа:
17
21
18
22
```typescript
19
23
type NumberOrString = number | string;
@@ -22,24 +26,28 @@ theory: |
22
26
val = 'My string'; // OK
23
27
val = true; // Type 'boolean' is not assignable to type 'NumberOrString'.
24
28
```
29
+
30
+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
На практике нередко встречаются случаи, когда нам нужно поддержать работу функции с большим количеством типов. В JavaScript мы можем соединить строку не только со строкой, но и числом, булевыми значениями и не только. Для решения похожей задачи в прошлых уроках мы познакомились с перегрузкой функции. Опишем тип такой функции с применением объединения:
34
+
На практике нередко встречаются случаи, когда нам нужно поддержать работу функции с большим количеством типов. В JavaScript мы можем соединить строку не только со строкой, но и числом или булевыми значениями. Для решения похожей задачи в прошлых уроках мы познакомились с перегрузкой функции. Опишем тип такой функции с применением объединения:
29
35
30
36
```typescript
31
37
type AllowedToConcatenation = number | string | null | undefined | boolean;
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
43
+
44
+
Чтобы описать типы функции `concat()`, нам бы потребовалось написать код для каждого случая отдельно.
35
45
36
-
Для описания типов функции `concat()` нам бы потребовалось написать код для каждого случая отдельно.
37
-
38
-
Union Types используется повсеместно, где программист хочет сказать, что переменная может содержать значения разных, но заранее описанных типов. Для указания абсолютно произвольных типов может использоваться `unknown` или дженерики, которые рассмотрим дальше в курсе.
46
+
Union Types используется повсеместно, где программист хочет сказать, что переменная может содержать значения разных, но заранее описанных типов. Чтобы указать абсолютно произвольные типы, может использоваться `unknown` или дженерики, которые рассмотрим далее в курсе.
39
47
40
48
instructions: |
41
49
42
-
Реализуйте функцию `lastIndex(str, char)`, возвращающую индекс последнего вхождения символа в строку или `null`, если такого символа нет.
50
+
Реализуйте функцию `lastIndex(str, char)`, которая возвращает индекс последнего вхождения символа в строку или `null`, если такого символа нет.
0 commit comments