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

Можно ли описать в TypeScript тип самописной функции?

1.7 Middle🔥 171 комментариев
#JavaScript Core#TypeScript

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Описание типов функций в TypeScript

Да, в TypeScript полностью возможно и даже необходимо описывать типы самописных функций. Это один из ключевых механизмов для обеспечения типобезопасности и улучшения документирования кода.

Основные способы типизации функций

Function Type Expressions

Самый простой способ - использовать function type expression, где указываются параметры и возвращаемый тип:

// Базовый синтаксис
type Add = (a: number, b: number) => number;

const add: Add = (a, b) => a + b;

// Или прямо в параметре функции
function multiply(a: number, b: number): number {
  return a * b;
}

Function Type с опциональными параметрами

// Опциональные параметры
type Greet = (name: string, age?: number) => string;

const greet: Greet = (name, age) => {
  return age ? `${name}, ${age}` : name;
};

// Параметры с дефолтными значениями
function logUser(id: number, name: string = 'Unknown'): void {
  console.log(`User ${id}: ${name}`);
}

Generics для переиспользуемых функций

// Параметризованные типы
type Filter<T> = (items: T[], predicate: (item: T) => boolean) => T[];

const filter: Filter<number> = (items, predicate) => {
  return items.filter(predicate);
};

// Функция с generics
function map<T, U>(items: T[], transform: (item: T) => U): U[] {
  return items.map(transform);
}

const doubled = map([1, 2, 3], x => x * 2);

Overload сигнатуры

Для функций с разным поведением в зависимости от типа входных данных:

function format(value: string): string;
function format(value: number): string;

function format(value: string | number): string {
  if (typeof value === 'string') {
    return value.toUpperCase();
  }
  return value.toFixed(2);
}

Лучшие практики

1. Всегда указывай return type - это предотвращает ошибки и улучшает читаемость:

const calculate = (a: number, b: number): number => a + b;

2. Используй типы для callback-функций:

interface ButtonProps {
  onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
  children: React.ReactNode;
}

export function Button({ onClick, children }: ButtonProps) {
  return <button onClick={onClick}>{children}</button>;
}

3. Для сложных типов используй type aliases или interfaces:

type ValidationFn = (value: unknown) => { valid: boolean; error?: string };

const validateEmail: ValidationFn = (value) => {
  if (typeof value !== 'string') return { valid: false, error: 'Must be string' };
  return { valid: value.includes('@'), error: 'Invalid email' };
};

Типизация функций - это не просто requirement, это лучшая практика, которая делает код надёжнее, облегчает рефакторинг и помогает избежать runtime ошибок.