Полное руководство по TypeScript: передача функций как типов

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

  1. Аннотации типов функций.
    В TypeScript вы можете аннотировать тип функции, используя следующий синтаксис:
type MyFunctionType = (param1: number, param2: string) => boolean;

Здесь MyFunctionTypeпредставляет тип, описывающий функцию, принимающую numberи stringв качестве параметров и возвращающую boolean.

  1. Функции обратного вызова.
    Передача функций в качестве обратных вызовов — распространенный вариант использования в JavaScript и TypeScript. Рассмотрим следующий пример:
function doSomething(callback: (result: string) => void) {
  // Perform some task
  const result = "Completed";
  callback(result);
}
function callbackFunction(result: string) {
  console.log(`Task completed: ${result}`);
}
doSomething(callbackFunction);

В этом примере функция doSomethingпринимает функцию обратного вызова типа (result: string) => void. callbackFunctionпередается как обратный вызов, который будет вызван после завершения задачи.

  1. Функции высшего порядка.
    Функции высшего порядка — это функции, которые принимают одну или несколько функций в качестве аргументов или возвращают функцию. TypeScript позволяет определять функции высшего порядка с конкретными типами функций. Вот пример:
type MathOperation = (a: number, b: number) => number;
function calculate(a: number, b: number, operation: MathOperation) {
  return operation(a, b);
}
function add(a: number, b: number) {
  return a + b;
}
function subtract(a: number, b: number) {
  return a - b;
}
const result1 = calculate(5, 3, add); // returns 8
const result2 = calculate(5, 3, subtract); // returns 2

В этом примере функция calculateпринимает два числа и функцию типа MathOperation, которая выполняет требуемую операцию с числами.

  1. Перегрузки функций.
    TypeScript позволяет определять несколько сигнатур функций для одной функции с помощью перегрузок функций. Это особенно полезно, когда у вас есть функция, которая может принимать разные типы или количество аргументов. Вот пример:
function processValue(value: string): void;
function processValue(value: number): string;
function processValue(value: string | number): string | void {
  if (typeof value === "string") {
    // Process string value
    return value.toUpperCase();
  } else if (typeof value === "number") {
    // Process numeric value
    return value.toString();
  }
}
const result1 = processValue("hello"); // returns "HELLO"
const result2 = processValue(42); // returns "42"

В этом примере функция processValueопределена с двумя сигнатурами функций. В зависимости от типа переданного аргумента он либо вернет строку, либо выполнит некоторую обработку и вернет void.

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