C.W.K.
Stream
Lesson 05 of 07 · published

Default 타입 Parameter

~7 min · generics, defaults, ergonomics

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"흔한 case 가 덜 쓰게 만들어."

문법

Default 타입 parameter 가 default 함수 parameter 와 같은 `=` 문법 써: type Result<T, E = Error> 가 "caller 가 E 안 주면 Error 써" 말함. Default 가 caller 가 slot 안 채울 때만 적용.

이건 순수 ergonomic 기능 — 모든 default 가 call site 에 타입 써서 표현 가능하기도. Default 가 20% 안 포기하고 80% case 간결하게 만들려 존재.

흔한 사용

  • Error 타입이 Error default: type Result<T, E = Error>
  • State 타입이 빈 object default: type Action<S = {}>
  • Element 타입이 unknown default: type Container<T = unknown>
  • Component props 가 empty default: type Component<P = {}>

Constraint + default

결합 가능: <T extends Constraint = Fallback>. Default 가 constraint 만족해야. 안 하면 compiler 가 call site 아니라 선언에서 에러. 이게 library 가 안전 (constraint 통해) 과 편의 (default 통해) 둘 다 제공하는 법.

Default 타입 parameter 가 흔한 case 의 유연성을 간결성과 거래. 명백한 default 있고 대부분 caller 가 쓸 때 써. 과용 안 함 — 너무 많은 default 가 타입의 의도 불명확하게.

Code

Default 가 흔한 case 간결하게·typescript
// Default — 간결한 흔한 case.
type Result<T, E = Error> =
  | { ok: true; value: T }
  | { ok: false; error: E };

function parse(s: string): Result<number> {  // E 가 Error 로 default
  const n = Number(s);
  if (Number.isNaN(n)) return { ok: false, error: new Error('NaN') };
  return { ok: true, value: n };
}

// 필요할 때 default override.
type CustomError = { code: number; msg: string };
function parseCustom(s: string): Result<number, CustomError> {
  // ...
  return { ok: false, error: { code: 1, msg: 'parse error' } };
}

// Constraint + default — library 패턴.
function event<T extends Event = Event>(handler: (e: T) => void) { /* ... */ }
event((e) => e.preventDefault());          // T = Event
event<MouseEvent>((e) => e.clientX);       // T = MouseEvent, narrow 됨

External links

Exercise

E 가 default 로 에러 메시지 문자열인 type ApiResponse<T, E = string> 정의. 그다음 성공에 ApiResponse<User> 반환하는 함수와 명시적 override 에 ApiResponse<User, ValidationError> 반환하는 함수 써. 둘 다 type-check 확인.
Hint
E 안 전달하면 string 으로 fallback. 전달하면 constraint (여기 없지만 E extends ... 추가 가능) 가 뭐 전달 가능한지 제한.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.