🎯 学习目标

  • 掌握剩余参数的语法和类型
  • 理解剩余参数与 arguments 的区别
  • 学会在类型定义中使用剩余参数
  • 了解剩余参数的实际应用场景

📝 基本语法

// 剩余参数使用 ... 语法 function sum(...numbers: number[]): number { return numbers.reduce((total, num) => total + num, 0); } sum(1, 2, 3); // 6 sum(1, 2, 3, 4, 5); // 15 sum(); // 0 // 结合普通参数 function greet(greeting: string, ...names: string[]): string { return `${greeting}, ${names.join(' and ')}!`; } greet('Hello', 'Alice'); // "Hello, Alice!" greet('Hi', 'Alice', 'Bob'); // "Hi, Alice and Bob!" greet('Hey', 'Alice', 'Bob', 'Charlie'); // "Hey, Alice and Bob and Charlie!"

🔧 类型定义

// 函数类型中的剩余参数 type MathOperation = (initial: number, ...operands: number[]) => number; const add: MathOperation = (initial, ...operands) => { return operands.reduce((sum, n) => sum + n, initial); }; // 元组类型作为剩余参数 function printCoord(...coords: [number, number, string]) { const [x, y, label] = coords; console.log(`${label}: (${x}, ${y})`); } printCoord(10, 20, 'Point A');

💻 实际应用

// 日志函数 function log(level: 'info' | 'warn' | 'error', ...messages: string[]): void { const timestamp = new Date().toISOString(); console.log(`[${timestamp}] [${level.toUpperCase()}]`, ...messages); } log('info', 'User logged in', 'userId: 123'); log('error', 'Database error', 'Connection timeout'); // 工具函数:合并对象 function merge<T extends object>(target: T, ...sources: Partial<T>[]): T { return Object.assign({}, target, ...sources); } const defaults = { theme: 'light', lang: 'en' }; const config = merge(defaults, { theme: 'dark' }, { lang: 'zh' });

📝 本节小结

  • • 使用 ... 收集剩余参数为数组
  • • 剩余参数必须是最后一个参数
  • • 类型可以是数组或元组
  • • 替代 arguments 对象,有类型检查