# Псевдонимы типов в Rust (type alias): синтаксис и практические кейсы

> Зачем использовать type alias в Rust. Упрощаем сложные сигнатуры функций, дженерики и Result-типы с помощью псевдонимов типов на понятных примерах.

- **URL:** https://eagle2000.space/rust/rust-type-alias/
- **Date:** 2025-05-25

- **Tags:** rust, dev

---## Введение
Псевдонимы типов `type aliases` — это способ дать существующему типу альтернативное, более понятное имя (аналог никнейм).

Вместо того чтобы читать "i32", вы сразу видите: это `метры`, это `айдишник юзера` или это `цельсии`. Такой подход делает код яснее, безопаснее и проще в сопровождении.


## Пример

Представим, что вы пишете программу для спортивных соревнований. Вам нужно оперировать длиной трассы.

```rust
fn main() {
    let race_distance: i32 = 1600;
}
```

Rust по умолчанию определит тип i32 для переменной. Но **1600 чего**? Метров, милей, cантиметров? _Совсем неоднозначно._ 

Такое значение без контекста легко может привести к ошибке.

Используем псевдоним для типа i32.

```rust
type Meters = i32;

fn main() {
    let race_distance: Meters = 1600;
}
```

Теперь стало проще и из кода понятно: **это метры**.

___

## Как объявить псевдоним для типа?

Синтаксис простой:

```rust
type NameAlias = Существующий_тип;
```

{{< alert "lightbulb"  >}}
Старайтесь придерживаться именования `CamelСase` -> слова пишутся слитно без пробелов, при этом каждое слово внутри фразы пишется с прописной буквы
{{< /alert >}}

## Повторное использование

Псевдонимы можно легко переиспользовать:

```rust
type Meters = i32;

fn main() {
    let race_one_distance: Meters = 1600;
    let race_two_distance: Meters = 3000;
}
```

Такой подход особенно полезен при работе с единицами измерения, координатами, идентификаторами и другими значениями, которые иначе были бы просто `i32`, `u64`, `String` и так далее.

## Псевдонимы для сложных типов

Псевдонимы особенно удобны, когда у вас есть **длинные или вложенные типы**. Например, колбэки (функции обратного вызова в аргументах):

### Без псевдонима


```rust
fn run_callback(cb: fn(i32) -> bool) {
    if cb(10) {
        println!("Callback returned true");
    }
}
```

### С псевдонимом

```rust
type IntPredicate = fn(i32) -> bool;

fn run_callback(cb: IntPredicate) {
    if cb(10) {
        println!("Callback returned true");
    }
}
```

Теперь это читается гораздо проще.

___

## Где еще удобно использовать псевдонимы?

### Типы ошибок

```rust
type Result<T> = std::result::Result<T, MyError>;
```

### Функции-обработчики обратного вызова (колбэки/callbacks)

```rust
type EventHandler = fn(Event) -> ();
```


### При работе с деньгами

```rust
type Rubles = f64;
fn calculate_total(price: Rubles, discount: Rubles) -> Rubles {
    price - discount
}
```

### Идентификаторы в веб-разработке

```rust
type UserId = String;
fn get_user(id: UserId) { ... }
```

### Разработка игр

```rust
type HealthPoints = u32;
let player_health: HealthPoints = 100;
```


{{< alert icon="lightbulb" >}}
Важные моменты:

- Не злоупотребляйте ими - если тип и так понятен (например, `count: i32`), псевдоним не нужен
- Используйте там, где важно подчеркнуть смысл данных
- Помните, что это просто переименование - компилятор всё равно видит исходный тип
{{< /alert >}}

## Итог

Используйте алиасы типов везде, где базовый тип не раскрывает достаточного смысла или где повторяется сложная сигнатура.

В своей практике я почти в каждом языке встречал алиасы для типов и использовал их в работе, это полезная возможность.


