add typescript
This commit is contained in:
86
docs/typescript/04-generic-types.md
Normal file
86
docs/typescript/04-generic-types.md
Normal file
@@ -0,0 +1,86 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Generic types
|
||||
|
||||
**Generics (обобщения)** в TypeScript — это механизм, который позволяет создавать универсальные, переиспользуемые компоненты (функции, классы, интерфейсы), которые могут работать с разными типами данных, сохраняя при этом безопасность типов.
|
||||
|
||||
## Зачем нужны Generics?
|
||||
- **Повторное использование кода:** Generics позволяют писать универсальные функции и классы, которые могут работать с любыми типами.
|
||||
- **Безопасность типов:** Generics сохраняют информацию о типах, что помогает избежать ошибок на этапе компиляции.
|
||||
- **Гибкость:** Generics позволяют создавать компоненты, которые могут адаптироваться к разным типам данных.
|
||||
|
||||
## Примеры использования Generics
|
||||
|
||||
### 1. Функции с Generics
|
||||
```ts
|
||||
function identity<T>(arg: T): T {
|
||||
return arg;
|
||||
}
|
||||
|
||||
let output1 = identity<string>("Hello"); // Тип: string
|
||||
let output2 = identity<number>(42); // Тип: number
|
||||
```
|
||||
**`T`** — это обобщенный тип (type parameter), который заменяется на конкретный тип при вызове функции.
|
||||
|
||||
### 2. Классы с Generics
|
||||
```ts
|
||||
class Box<T> {
|
||||
private value: T;
|
||||
|
||||
constructor(value: T) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
getValue(): T {
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
|
||||
let box1 = new Box<string>("Hello");
|
||||
let box2 = new Box<number>(42);
|
||||
```
|
||||
Класс **`Box`** может работать с любым типом данных, переданным в **`T`**.
|
||||
|
||||
### 3. Интерфейсы с Generics
|
||||
```ts
|
||||
interface Pair<T, U> {
|
||||
first: T;
|
||||
second: U;
|
||||
}
|
||||
|
||||
let pair: Pair<string, number> = { first: "Age", second: 30 };
|
||||
```
|
||||
Интерфейс **`Pair`** может работать с двумя разными типами (**`T`** и **`U`**).
|
||||
|
||||
### 4. Ограничения Generics (Constraints)
|
||||
Иногда нужно ограничить типы, которые можно передать в Generics. Для этого используется ключевое слово **`extends`**.
|
||||
```ts
|
||||
interface Lengthwise {
|
||||
length: number;
|
||||
}
|
||||
|
||||
function logLength<T extends Lengthwise>(arg: T): void {
|
||||
console.log(arg.length);
|
||||
}
|
||||
|
||||
logLength("Hello"); // ОК, у строки есть свойство length
|
||||
logLength([1, 2, 3]); // ОК, у массива есть свойство length
|
||||
logLength(42); // Ошибка: у числа нет свойства length
|
||||
```
|
||||
|
||||
### 5. Generics по умолчанию
|
||||
Можно указать тип по умолчанию для Generics, если тип не был передан явно.
|
||||
```ts
|
||||
function createArray<T = string>(length: number, value: T): T[] {
|
||||
return Array(length).fill(value);
|
||||
}
|
||||
|
||||
let strings = createArray(3, "x"); // string[]
|
||||
let numbers = createArray<number>(3, 42); // number[]
|
||||
```
|
||||
## Преимущества Generics
|
||||
- **Универсальность:** Generics позволяют писать код, который работает с разными типами.
|
||||
- **Безопасность типов:** TypeScript проверяет типы на этапе компиляции, что помогает избежать ошибок.
|
||||
- **Читаемость:** Generics делают код более выразительным и понятным.
|
||||
Reference in New Issue
Block a user