Optional и Default параметры

Optional-параметры (помечаются ?) и default-параметры (с = значение) в TypeScript — способы сделать параметры функций необязательными: optional допускает отсутствие аргумента (тип T | undefined), default задаёт значение при отсутствии или при передаче undefined.

Зачем нужно

Большинство функций имеют параметры с разумными умолчаниями. Optional и default параметры позволяют не передавать лишние аргументы в простых случаях, оставляя гибкость для сложных. Это улучшает ergonomics API и уменьшает потребность в перегрузках.

Где используется

  • Функции с опциями/конфигурацией: createServer({ port?: number })
  • Утилиты с дефолтным поведением: slice(start, end = array.length)
  • Методы с опциональными колбэками или флагами
  • Конструкторы классов с частично заполняемыми параметрами

Основной контент

Optional параметры (?)

function greet(name: string, greeting?: string): string {
  // greeting: string | undefined
  const g = greeting ?? "Hello";
  return `${g}, ${name}!`;
}

greet("Alice");            // "Hello, Alice!"
greet("Bob", "Hi");        // "Hi, Bob!"
greet("Carol", undefined); // "Hello, Carol!"

Default параметры

function greet(name: string, greeting: string = "Hello"): string {
  // greeting: string (undefined отфильтрован TypeScript-ом)
  return `${greeting}, ${name}!`;
}

greet("Alice");            // "Hello, Alice!"
greet("Bob", "Hi");        // "Hi, Bob!"
greet("Carol", undefined); // "Hello, Carol!" — undefined → дефолт

Сравнение optional и default

// Optional — тип: string | undefined, нужна проверка
function f1(x?: string) {
  return x?.toUpperCase(); // string | undefined
}

// Default — тип: string (всегда)
function f2(x: string = "default") {
  return x.toUpperCase(); // string
}

Порядок параметров

// Optional и default — ПОСЛЕ обязательных
function log(message: string, level: string = "info", timestamp?: Date): void {
  const ts = timestamp?.toISOString() ?? new Date.toISOString();
  console.log(`[${level}] ${ts} ${message}`);
}

// Ошибка: обязательный после optional
// function wrong(a?: string, b: string): void {}

Optional параметры в интерфейсах

interface Config {
  host: string;
  port?: number;     // number | undefined
  timeout?: number;
  debug?: boolean;
}

function createServer(config: Config) {
  const port    = config.port ?? 3000;
  const timeout = config.timeout ?? 30_000;
  console.log(`${config.host}:${port}`);
}

createServer({ host: "localhost" });          // OK
createServer({ host: "localhost", port: 8080 }); // OK

Default с деструктурированием

interface Options {
  verbose: boolean;
  maxRetries: number;
}

function fetchData(
  url: string,
  { verbose = false, maxRetries = 3 }: Partial<Options> = {}
): void {
  if (verbose) console.log(`Fetching ${url}, retries: ${maxRetries}`);
}

fetchData("/api");                          // verbose=false, maxRetries=3
fetchData("/api", { verbose: true });       // verbose=true, maxRetries=3
fetchData("/api", { maxRetries: 5 });       // verbose=false, maxRetries=5

Частые ошибки

  • Обязательный параметр после optional(a?: string, b: string) запрещено компилятором.
  • Не проверять undefined для optionalgreeting типа string | undefined нельзя передать туда где нужен string без проверки.
  • Мутировать объект-умолчаниеfunction f(opts = globalDefaults) — мутация opts изменит глобальный объект; безопаснее = {}.
  • Путать undefined с null — default-параметр срабатывает на undefined, но не на null; null не заменяется дефолтом.

Связанные темы

Ресурсы