"Awaited는 비동기 포장을, NonNullable은 null과 undefined 가능성을 벗겨."
Awaited는 await의 타입 동작을 닮아
Awaited<Promise<string>>은 string이야. Promise가 여러 겹이어도 최종 값에 닿을 때까지 재귀적으로 벗기고, 입력이 Promise가 아니면 원래 타입을 그대로 돌려줘. JavaScript의 await가 thenable을 평평하게 다루는 동작을 타입으로 표현한 도구야.
비동기 함수가 최종적으로 돌려줄 값은 Awaited<ReturnType<typeof load>>로 얻을 수 있어. Promise를 직접 다시 적지 않으므로 함수 계약이 바뀌어도 함께 따라간다.
NonNullable은 두 빈 값을 제거해
NonNullable<string | null | undefined>은 string이야. 유니언의 각 구성원에 조건을 분배해 null과 undefined를 never로 바꾸고 나머지만 남기는 방식으로 생각할 수 있어.
중요한 점은 타입만 제거한다고 실행값이 검증되는 것은 아니라는 거야. 값이 실제로 null이 아님을 조건문이나 검사 함수로 증명한 뒤 좁혀진 결과를 반환해야 해. 단언으로 NonNullable을 억지로 맞추면 빈 가능성을 숨길 뿐이야.
유틸리티 타입은 증명의 결과를 표현하지 증명을 대신하지 않아. 먼저 실행 코드로 포장과 빈 가능성을 처리하고 타입이 그 사실을 따라가게 해.