Skip to content

Commit 6dcf9c4

Browse files
authored
Editing (#191)
* edited
1 parent 62406f9 commit 6dcf9c4

File tree

5 files changed

+84
-44
lines changed

5 files changed

+84
-44
lines changed

modules/25-types/10-type-as-sets/description.ru.yml

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,28 @@
33
name: Типы как множества
44
theory: |
55
6-
Что вообще такое тип данных? Чтобы ответить на этот вопрос, лучше начать с ответа на вопрос, что было до типов данных? Семейство языков, в котором нет типов данных, называется ассемблером. Эти языки работают напрямую с процессором и оперируют его регистрами. В регистрах хранятся значения, которые, с точки зрения языка, являются числами. А что закодировано за этим числом, должен определять сам программист, будь то строка или часть картинки.
6+
В этом уроке мы познакомимся с типами данных и узнаем, чем они полезны для разработчика. Также мы поговорим про типы как про множества. Это позволит понимать принципы работы TypeScript.
7+
8+
## Типы данных
9+
10+
Семейство языков, в котором нет типов данных, называется ассемблером. Эти языки работают напрямую с процессором и оперируют его регистрами. В регистрах хранятся значения, которые с точки зрения языка являются числами. А что закодировано за этим числом, должен определять сам программист. Это может быть строка или часть картинки.
711
8-
Главная проблема такого подхода — в отсутствии какой-либо безопасности. Программа никогда не выдаст ошибку, если мы случайно что-то сделаем со "строкой", чего с ней делать нельзя. С точки зрения процессора и языка программирования, строки нет — есть число, и мы выполняем над ним какие-то операции. В итоге программа работает всегда, но результат неверный. Представьте себе, какой уровень внимательности нужен, чтобы программировать в таком режиме.
12+
Главная проблема такого подхода — отсутствие безопасности. Программа не выдаст ошибку, если мы случайно что-то сделаем со строкой, чего с ней делать нельзя. С точки зрения процессора и языка программирования, строки нет — есть число, и мы выполняем над ним какие-то операции. В итоге программа работает всегда, но результат неверный. В этом случае нужен высокий уровень внимательности, чтобы программировать в таком режиме.
913
10-
Ситуацию исправило появление типов данных в высокоуровневых языках. Типы позволили выполнить две задачи:
14+
Ситуация исправилась, когда появились типы данных в высокоуровневых языках. Они позволили выполнить две задачи:
1115
1216
* Описать и ограничить множество всех значений конкретного типа
1317
* Определить операции, которые возможно выполнить с этим типом
1418
15-
Все это заложено в определении: Тип данных — это множество всех значений и набор допустимых операций над ними. Что нам это дает? Типобезопасность. Даже в динамическом языке, таком как JavaScript, мы получаем значительно более сильную безопасность, чем в ассемблере. В статическом же, таком как TypeScript, уровень проверки совместимости типов выходит на другой уровень.
19+
**Тип данных** — это множество всех значений и набор допустимых операций над ними. Это обеспечивает типобезопасность. Даже в динамическом языке, например, в JavaScript, мы получаем более сильную безопасность, чем в ассемблере. В статическом TypeScript уровень проверки совместимости типов выходит на другой уровень.
20+
21+
<!-- TODO - автору: 1. Поймет ли студент, что значит "типобезопасность"? Если нет, стоит объяснить. 2. "В статическом TypeScript уровень проверки совместимости типов выходит на другой уровень" - звучит абстрактно. Что значит на новый уровень? В этом случае безопасность еще лучше? -->
1622
1723
## Множества
1824
19-
Обычно, когда говорят про определение типов, в первую очередь обращают внимание на вторую часть: "набор допустимых операций". А вот первая часть кажется более размытой: "набор допустимых значений". С одной стороны, это может быть ограничение числа по верхней и нижней границе, как в JavaScript. У нас есть `Number` для одного диапазона чисел и `BigInt` для другого, когда нужно работать с огромными числами. С другой, мы ведь говорим про множества.
25+
Если говорить про типы данных, как про набор допустимых значений, то с одной стороны, это может быть ограничение числа по верхней и нижней границе. Например, так устроено в JavaScript. У нас есть `Number` для одного диапазона чисел и `BigInt` для другого, когда нужно работать с огромными числами. С другой стороны, мы говорим про множества.
2026
21-
И вот этот взгляд на типы как на множества имеет огромную роль в нашем случае. Связано это с тем, что система типов языка TypeScript умеет комбинировать типы так, как это делается в обычных множествах. Например, мы можем объединить два множества типов, получив новый тип, в который входят все элементы первого множества (типа) и второго множества (типа). Так появляется Union Type:
27+
Взгляд на типы как на множества играет важную роль. Это связано с тем, что система типов языка TypeScript умеет комбинировать типы так, как это делается в обычных множествах. Например, мы можем объединить два множества типов и получить новый тип, в который входят все элементы первого множества и второго множества. Так появляется Union Type:
2228
2329
```typescript
2430
type SomeType = number | string;
@@ -27,8 +33,10 @@ theory: |
2733
```
2834
2935
![SomeType](https://raw.githubusercontent.com/hexlet-basics/exercises-typescript/main/modules/25-types/10-type-as-sets/assets/some_type.png)
36+
37+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
3038
31-
Примерно таким же способом мы можем построить пересечение типов, расширение и сделать другие интересные штуки с типами. Кое-что мы рассмотрим дальше по курсу, но часть вещей останется за пределами. Но, что бы ни происходило дальше, важно перестроить свое мышление на операции с типами: это позволит значительно упростить понимание принципов работы TypeScript и вы сможете лучше запоминать, а иногда даже сами догадываться до определенного поведения.
39+
Примерно таким же способом можно построить пересечение и расширение типов и сделать другие действия с типами. Некоторые из них мы рассмотрим в курсе, но часть вещей останется за пределами. Главное — нужно перестроить свое мышление на операции с типами. Так будет проще понимать принципы работы TypeScript и запоминать определенное поведение.
3240
3341
instructions: |
3442

modules/25-types/20-union-types/description.ru.yml

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
name: Объединения (Union Types)
44
theory: |
55
6-
Объединения типов играют большую роль в TypeScript, они позволяют выразить обычную для JavaScript ситуацию, когда возвращаемое значение или аргумент функции могут быть различного типа. Например метод `String.prototype.at()` может возвращать значение типа `string`, либо `undefined`.
6+
В этом уроке мы научмся работать с объединениями типов, которые играют большую роль в TypeScript. Они позволяют выразить обычную ситуацию для JavaScript, когда возвращаемое значение или аргумент функции могут быть различного типа. Например, метод `String.prototype.at()` может возвращать значение типа `string` либо `undefined`.
77
8-
Объединение указывается с помощью оператора прямой черты `|`, по обе стороны которого располагаются типы. Давайте определим свой тип для функции `at`:
8+
Объединение указывается с помощью оператора прямой черты `|`, по обе стороны которого располагаются типы.
9+
10+
Определим свой тип для функции `at`:
911
1012
```typescript
1113
type at = (str: string, position: number) => string | undefined;
1214
```
1315
14-
С точки зрения теории множеств, операция union обозначает объединение. Когда мы объединяем несколько множеств, получается новое множество, в которое входят все элементы исходных множеств.
16+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
17+
18+
С точки зрения теории множеств операция union обозначает объединение. Когда мы объединяем несколько множеств, получается новое множество, в которое входят все элементы исходных множеств.
1519
16-
Применительно к TypeScript это означает, что в результате мы получаем тип, обещающий содержать переменную одного из типов объединения. Так мы можем завести свой тип, под который попадают все строки **ИЛИ** числа:
20+
В TypeScript это означает, что в результате мы получаем тип, который обещает содержать переменную одного из типов объединения. Так мы можем завести свой тип, под который попадают все строки **ИЛИ** числа:
1721
1822
```typescript
1923
type NumberOrString = number | string;
@@ -22,24 +26,28 @@ theory: |
2226
val = 'My string'; // OK
2327
val = true; // Type 'boolean' is not assignable to type 'NumberOrString'.
2428
```
29+
30+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
2531
2632
![NumberOrString](https://raw.githubusercontent.com/hexlet-basics/exercises-typescript/main/modules/25-types/20-union-types/assets/number_or_string.png)
2733
28-
На практике нередко встречаются случаи, когда нам нужно поддержать работу функции с большим количеством типов. В JavaScript мы можем соединить строку не только со строкой, но и числом, булевыми значениями и не только. Для решения похожей задачи в прошлых уроках мы познакомились с перегрузкой функции. Опишем тип такой функции с применением объединения:
34+
На практике нередко встречаются случаи, когда нам нужно поддержать работу функции с большим количеством типов. В JavaScript мы можем соединить строку не только со строкой, но и числом или булевыми значениями. Для решения похожей задачи в прошлых уроках мы познакомились с перегрузкой функции. Опишем тип такой функции с применением объединения:
2935
3036
```typescript
3137
type AllowedToConcatenation = number | string | null | undefined | boolean;
3238
3339
const concat = (base: AllowedToConcatenation, suffix: AllowedToConcatenation): string => `${base}${suffix}`;
3440
```
41+
42+
<!-- TODO - автору: нужно описать код - на что обратить внимание или что сделали -->
43+
44+
Чтобы описать типы функции `concat()`, нам бы потребовалось написать код для каждого случая отдельно.
3545
36-
Для описания типов функции `concat()` нам бы потребовалось написать код для каждого случая отдельно.
37-
38-
Union Types используется повсеместно, где программист хочет сказать, что переменная может содержать значения разных, но заранее описанных типов. Для указания абсолютно произвольных типов может использоваться `unknown` или дженерики, которые рассмотрим дальше в курсе.
46+
Union Types используется повсеместно, где программист хочет сказать, что переменная может содержать значения разных, но заранее описанных типов. Чтобы указать абсолютно произвольные типы, может использоваться `unknown` или дженерики, которые рассмотрим далее в курсе.
3947
4048
instructions: |
4149
42-
Реализуйте функцию `lastIndex(str, char)`, возвращающую индекс последнего вхождения символа в строку или `null`, если такого символа нет.
50+
Реализуйте функцию `lastIndex(str, char)`, которая возвращает индекс последнего вхождения символа в строку или `null`, если такого символа нет.
4351
4452
```typescript
4553
const str = 'test';

0 commit comments

Comments
 (0)