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для optional —greetingтипаstring | undefinedнельзя передать туда где нуженstringбез проверки. - Мутировать объект-умолчание —
function f(opts = globalDefaults)— мутацияoptsизменит глобальный объект; безопаснее= {}. - Путать
undefinedсnull— default-параметр срабатывает наundefined, но не наnull;nullне заменяется дефолтом.
Связанные темы
- Типизация функций -- параметры и возврат
- interface -- объявление и использование
- Partial, Required, Readonly
- _MOC TypeScript