ZeroCho / ts-book

타입스크립트 교과서 소스 코드
36 stars 5 forks source link

[p.222, 문의] 밑에서 2번째 줄 #15

Closed wiseguy77 closed 10 months ago

wiseguy77 commented 10 months ago

Promise.all 의 반환타입에 따라 p.222 마지막 예제코드 처럼 결과가 Promise<{ 0 : string, 1: number, 2: boolean }> 이고

여기서 규칙2를 적용하면 결과타입이 { 0 : string, 1: number, 2: boolean } 일 것 같은데, 최종 결과 타입이 [string, number, boolean] 으로 되는 과정이 잘 이해가 되지 않습니다.

제가 어떤 부분을 놓치고 있는 걸까요?

ZeroCho commented 10 months ago

222쪽 첫 번째 예제에서 Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>를 풀어서 설명한 것입니다. 정확한 게 아니라 "다음과 비슷합니다" 라고 표현해두었습니다.

wiseguy77 commented 10 months ago

사실 가장 궁금한 부분은 d.ts 에 정의된 오브젝트 타입이 어떻게 최종적으로 튜플 타입으로 결정 되는지가 가장 이해가 되지 않습니다. 혹시 이 부분은 타입 선언부가 아니라 실제 구현부를 봐야 정확히 확인이 가능한 부분일까요? 타입 코드라서 딱히 따로 구현부라 할 코드도 없을 것 같아서요.

ZeroCho commented 10 months ago

튜플이 { -readonly [P in keyof T]: Awaited<T[P]> } 이걸 거쳤는데 어떻게 다시 튜플이 되는지가 궁금하신 건가요? 말로 설명하면 튜플인 T의 각각의 속성 P에 대해 Awaited<T[P]>를 적용하고 readonly를 제거하라 입니다.

wiseguy77 commented 10 months ago

아! 이해 됐습니다. 제가 놓친 부분은 { -readonly [P in keyof T]: Awaited<T[P]> } 가 Array(Like)도 아니고 Tuple(Like)도 아닌데 어떻게 최종 결과타입이 튜플일까 고민했었거든요.

그런데 방금 해주신 설명과 p.79에서 배열 또는 튜플 타입 Copy 하는 부분 코드를 되짚어 보니, 애초에 Promiss.all 함수 인수의 타입 T가 배열이었기에 [P in keyof T]에서 배열의 나머지 속성(length 등)들도 복사되어 결과가 배열 또는 튜플 타입으로 결정되는 것이었네요. 계속 배열 요소들에만 매몰되어서 배열의 기본 속성들도 복사된다는 사실을 놓치고 있었습니다.

우문에 현답 고맙습니다^^