← Назад к вопросам

Что такое статическая типизация?

1.2 Junior🔥 161 комментариев
#JavaScript Core#TypeScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Статическая типизация

Статическая типизация — это система, при которой типы переменных, функций и выражений проверяются и определяются на этапе компиляции или разработки, до запуска кода. Это в отличие от динамической типизации, где типы определяются во время выполнения (runtime).

Динамическая vs Статическая типизация

// JavaScript — динамическая типизация
let value = 42;      // число
value = 'строка';    // строка (переприсвоение работает)
value = true;        // булево (переприсвоение работает)

// TypeScript — статическая типизация
let value: number = 42;
value = 'строка';    // Ошибка компиляции — тип не совпадает
value = true;        // Ошибка компиляции — тип не совпадает
value = 100;         // OK — число

Основные преимущества статической типизации

1. Ранее обнаружение ошибок

// Динамическая типизация — ошибка во время выполнения
function add(a, b) {
  return a + b;
}

add('10', 20); // '1020' (конкатенация вместо сложения!) — баг в runtime

// Статическая типизация — ошибка во время разработки
function add(a: number, b: number): number {
  return a + b;
}

add('10', 20); // Ошибка TypeScript: Argument of type 'string' is not assignable to parameter of type 'number'

2. Лучшая поддержка IDE

interface User {
  name: string;
  email: string;
  age: number;
}

const user: User = { name: 'John', email: 'john@example.com', age: 30 };
user. // IDE подсказывает: name, email, age (autocompletion)
user.phon // Ошибка — неправильное поле

3. Самодокументируемый код

// Сразу видно, какие типы ожидаются и что возвращает функция
function getUserById(id: number): Promise<User> {
  return fetch(`/api/users/${id}`).then(r => r.json());
}

// Без типов — нужно гадать
function getUserById(id) {
  return fetch(`/api/users/${id}`).then(r => r.json());
}

4. Рефакторинг с уверенностью

interface Product {
  id: number;
  title: string;
  price: number;
}

// Если изменить структуру Product, TypeScript найдёт все места, где это используется
const product: Product = { id: 1, title: 'Ноутбук', price: 1000 };
product.nme; // Ошибка типов

TypeScript — статическая типизация для JavaScript

// Примитивные типы
const age: number = 30;
const name: string = 'Иван';
const isActive: boolean = true;
const data: null = null;
const unknown_value: undefined = undefined;

// Объекты
interface Person {
  name: string;
  age: number;
  email?: string; // опциональное поле
}

const person: Person = {
  name: 'Мария',
  age: 25
};

// Функции
function greet(person: Person): string {
  return `Привет, ${person.name}`;
}

// Массивы
const numbers: number[] = [1, 2, 3];
const names: Array<string> = ['Иван', 'Мария'];
const mixed: (string | number)[] = [1, 'два', 3];

Продвинутые типы в TypeScript

// Union типы
type Status = 'pending' | 'success' | 'error';
const status: Status = 'success';
// status = 'invalid'; // Ошибка

// Generics (обобщённые типы)
function getFirstElement<T>(arr: T[]): T {
  return arr[0];
}

const firstNum = getFirstElement([1, 2, 3]); // T = number
const firstStr = getFirstElement(['a', 'b']); // T = string

// Readonly
interface ReadonlyUser {
  readonly id: number;
  readonly name: string;
}

// Utility типы
type Partial<T> = { [K in keyof T]?: T[K] };
type Required<T> = { [K in keyof T]-?: T[K] };
type Pick<T, K> = { [P in K]: T[P] };
type Record<K, T> = { [P in K]: T };

Где используется статическая типизация

// TypeScript
const value: string = 'hello';

// Python с type hints
def add(a: int, b: int) -> int:
    return a + b

// Java (статическая типизация по умолчанию)
public static int add(int a, int b) {
    return a + b;
}

// C++ (статическая типизация)
int add(int a, int b) {
    return a + b;
}

Недостатки статической типизации

// 1. Больше кода
function add(a: number, b: number): number { // много типов
  return a + b;
}

// vs JavaScript
function add(a, b) { // компактнее
  return a + b;
}

// 2. Кривая обучения
// Нужно понимать: interfaces, generics, union types, etc.

// 3. Время компиляции
// TypeScript нужно компилировать в JavaScript

Когда использовать

  • Большие проекты (>10k строк кода)
  • Командная разработка (типы как документация)
  • Критичные приложения (финансы, медицина)
  • Долгосрочные проекты (рефакторинг безопаснее)

Когда не нужна

  • Маленькие скрипты и прототипы
  • Быстрая разработка (MVPs)
  • Одиночная разработка с простым кодом

Вывод

Статическая типизация помогает писать безопаснее, надёжнее и проще поддерживать код. TypeScript в JavaScript экосистеме стал стандартом де-факто для серьезных проектов благодаря раннему обнаружению ошибок и лучшей поддержке IDE.