타입스크립트에서 함수 파라미터에 타입을 지정하는 것은 함수의 인자에 대해 명확한 타입을 정의하고 타입 안정성을 보장함.
또한 파라미터에 타입 지정을 통해 함수가 호출될 때 잘못된 타입의 인자가 전달되는 것을 컴파일 단계에서 방지할 수 있음.
: 각 함수의 파라미터에 명시적으로 타입을 지정하여 함수 호출 시 타입 오류를 방지함.
function greet(name: string): void {
  console.log("Hello, " + name);
}
greet("Alice");  // 정상 작동
greet(42);       // 오류 발생: Argument of type 'number' is not assignable to parameter of type 'string'.
이 코드에서 greet 함수는 name이라는 문자열(string) 타입의 파라미터를 받음.
만약 string이 아닌 number나 다른 타입의 값을 전달하면 타입스크립트는 컴파일 시점에서 오류를 발생시킴.
: 여러 개의 파라미터가 있는 함수에서도 각각의 파라미터에 타입을 지정할 수 있음. 각 파라미터는 함수 정의에서 각자의 타입을 가져야 함.
function add(a: number, b: number): number {
  return a + b;
}
add(5, 3);     // 정상 작동
add(5, "3");   // 오류 발생: Argument of type 'string' is not assignable to parameter of type 'number'.
이 함수는 두 개의 숫자 number 파라미터를 받고 그 합을 반환함.
만약 파라미터 중 하나라도 숫자가 아니면 컴파일 에러가 발생함.
: 타입스크립트에서는 특정 파라미터가 필수가 아니도록 할 수 있음. 이를 선택적 파라미터(optional parameter)라고 하며, 파라미터 뒤에 물음표(?)를 붙여서 선언할 수 있음. 선택적 파라미터는 전달되지 않을 경우 undefined 값을 가짐.
function greet(name: string, age?: number): void {
  if (age) {
    console.log(`Hello, ${name}. You are ${age} years old.`);
  } else {
    console.log(`Hello, ${name}.`);
  }
}
greet("Alice");        // "Hello, Alice."
greet("Bob", 25);      // "Hello, Bob. You are 25 years old."
: 파라미터에 기본값을 설정할 수 있음. 설정한 기본값이 있는 파라미터는 함수가 호출될 때 해당 인자를 전달하지 않으면 기본값 이 사용됨.
function greet(name: string, greeting: string = "Hello"): void {
  console.log(greeting + ", " + name);
}
greet("Alice");         // "Hello, Alice"
greet("Bob", "Hi");     // "Hi, Bob"
greeting 파라미터는 기본값으로 "hello"를 가지며, 값이 전달되지 않으면 기본값이 사용됨.
: Rest 파라미터를 사용하면 함수가 가변 인자를 받을 수 있음. Rest 파라미터는 배열로 수집되며, 타입 또한 배열 타입으로 지정할 수 있음.
function sum(...numbers: number[]): number {
  return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sum(1, 2, 3));      // 6
console.log(sum(10, 20, 30));   // 60
위 코드에서 sum 함수는 가변 인자(...number)를 받아서 배열로 처리하며, 각 요소는 number 타입임. 여러 개의 숫자를 전달하면 그 합을 구하는 함수임.
<>function sum(num1, num2, ...numbers)
: 하나 이상의 타입을 허용함
: 복잡한 객체 형태의 파라미터에 인터페이스 사용할 수 있음.