매개변수 계약

선택적 매개변수와 기본값

TypeScript에서 name?: string과 name = "guest"는 비슷해 보이지만 호출자와 함수 내부의 타입 의미가 다르다. 선택적 매개변수는 undefined 가능성을 남기고, 기본 매개변수는 undefined 입력을 내부 기본값으로 바꾼다.

01

빈값 의미 결정

값이 생략될 수 있는지, 생략되면 어떤 기본 동작을 할지 먼저 정한다.

없음과 기본값은 같은 뜻이 아니다
02

optional 사용

호출자가 값을 주지 않을 수 있고 함수 내부에서 분기해야 한다면 ?를 붙인다.

내부에서는 undefined 검사가 필요하다
03

default 사용

undefined가 들어오면 항상 같은 값으로 처리하고 싶을 때 기본값을 둔다.

null은 기본값으로 대체되지 않는다
04

매개변수 순서

필수 매개변수를 앞에 두고 선택 옵션은 뒤나 options 객체로 모은다.

중간 optional은 호출 모양을 헷갈리게 한다
05

호출 예시 검증

생략, undefined, null, 명시 값 입력을 각각 타입과 런타임 결과로 확인한다.

타입 안전성과 실행 의미를 같이 본다
param?: T
생략 가능 함수 내부 타입은 T 또는 undefined이므로 좁히기가 필요하다.
값 없음 자체가 의미 있을 때 쓴다
param = v
기본값 보장 undefined일 때 기본값으로 바뀌어 내부에서 더 좁은 타입으로 다루기 쉽다.
null은 그대로 들어온다
options
선택값 묶음 선택 매개변수가 늘어나면 객체로 묶어 호출 가독성과 확장성을 높인다.
순서 의존을 줄인다
overload
호출 형태 분리 인자 조합별 반환 타입이 달라질 때 overload나 union을 검토한다.
선택값 하나로 모든 차이를 숨기지 않는다

타입 확인

undefined 입력 인자를 생략한 경우와 undefined를 직접 넣은 경우가 같은지 확인한다.
null 입력 strictNullChecks에서 null이 허용되는지, 기본값으로 바뀌지 않는지 본다.
호출 가독성 선택 인자가 세 개 이상이면 options 객체로 바꾸는 편이 나은지 판단한다.