매개변수 흐름

기본 인자와 undefined

호출부의 인자 개수, undefined 전달, 기본값 적용, 타입 확인을 한 흐름으로 보면 선택적 매개변수와 기본 매개변수의 차이가 분명해진다.

호출 인자 처리 흐름

compile + runtime
1

호출

전달된 인자 개수와 위치를 시그니처에 맞춘다.

2

생략

뒤쪽 선택 인자는 빠지면 undefined로 읽힌다.

3

대체

기본값은 값이 undefined일 때만 적용된다.

4

추론

선언 타입과 기본값에서 매개변수 타입을 계산한다.

5

기본 인자 흐름 확인

필수 위치와 undefined 가능성을 컴파일 단계에서 막는다.

호출 매핑 undefined 기본값 타입확인

케이스별 판정

Array<T> 예시는 escape

인자 생략

pick(items)

index는 undefined로 들어온 뒤 기본값 0을 사용한다.

undefined 명시

pick(items, undefined)

중간 기본 매개변수를 건너뛸 때도 같은 대체 규칙을 탄다.

값 전달

pick(items, 2)

실제 값이 있으면 기본값은 실행되지 않고 number로 확인된다.

선언 타입

function pick<T>(
  items: Array<T>,
  index = 0
): T | undefined

기본값 0 때문에 index는 number로 추론되고 호출부에서는 생략 가능해진다.

검사 결과

통과: pick(names), pick(names, 1)

오류: pick(), pick(names, "1")

필수 매개변수 items는 반드시 필요하고, index는 number 또는 undefined만 허용된다.

설계 규칙

선택적 매개변수는 undefined 가능성을 드러내고, 기본 매개변수는 undefined가 들어온 순간 안전한 런타임 값을 주입한다.