"Awaited 가 Promise unwrap. NonNullable 이 null 과 undefined strip. 주마다 쓸 작은 utility 2개."
Awaited<T> — 재귀적으로 Promise unwrap
Awaited<Promise<string>> 가 string. Awaited<Promise<Promise<number>>> 도 number — Awaited 가 값이 더 이상 Promise 아닐 때까지 recurse. JavaScript runtime 과 match: await Promise.resolve(Promise.resolve(x)) 가 Promise<x> 아니라 x 로 resolve.
Awaited 가 TypeScript 4.5 에 정확히 옛 Promise<T> 모델이 중첩 Promise 를 정확히 처리 못 해서 추가됨. ReturnType<typeof asyncFn> 쓸 어디든, 실제 resolved 타입 얻으려면 Awaited 로 wrap 하고 싶어할 거.
NonNullable<T> — null 과 undefined strip
NonNullable<string | null | undefined> 가 string. Utility 가 union 에 distribution 써서 null 이나 undefined 인 어떤 멤버든 제거. 가능 nullable 타입 있고 (체크 후) 안전하다 주장하고 싶을 때 유용.
Awaited 와 NonNullable 이 외과적 타입 stripper. 한 번에 한 wrapper 풀어 — 첫째 Promise, 둘째 null/undefined. ReturnType 과 compose 해서 함수 참조에서 정확한 타입 빌드.