Можно ли описать в TypeScript тип самописной функции?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Описание типов функций в 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 ошибок.