Skip to content

189 - Awaited #7

@DEV4N4

Description

@DEV4N4
// your answers
type MyAwaited<T extends PromiseLike<any>> = 
T extends PromiseLike<infer U> // 1. 조건부 타입으로 추론
  ? U extends PromiseLike<any> // 2. 재귀적으로 내부가 또 Promise 인지 확인
    ? MyAwaited<U> // 3. 다시 MyAwaited를 호출해 내부 타입 추출
    : U // 4. Promise가 아니면 추출된 타입을 반환
  : never; // 5. PromiseLike가 아니면 never 반환

풀이

1. PromiseLike와 조건부 타입

T extends PromiseLike<any>:
입력 타입 T는 반드시 PromiseLike 타입이어야 합니다.

PromiseLike는 Promise와 비슷하게 .then 메서드를 가진 객체를 포괄적으로 나타냅니다.
이를 통해 MyAwaited는 반드시 Promise나 Promise처럼 작동하는 타입에서만 동작합니다.

2. 조건부 타입과 infer 사용

T extends PromiseLike<infer U>:

조건부 타입에서 infer 키워드를 사용해 T가 PromiseLike인지 검사합니다.
만약 T가 PromiseLike 타입이라면, Something을 U로 추론합니다.

예:

type Example = Promise<string>;
type Test = Example extends PromiseLike<infer U> ? U : never;
// Test는 string

3. 재귀적으로 내부 타입 추출

추출된 타입 U가 다시 PromiseLike 타입일 수 있으므로 다음 조건을 확인합니다:

U extends PromiseLike<any>

만약 U가 또 다른 PromiseLike라면, 재귀적으로 MyAwaited를 호출하여 가장 안쪽에 있는 타입을 계속 추출합니다.

예:

type NestedPromise = Promise<Promise<Promise<string>>>;
type Result = MyAwaited<NestedPromise>;
// 첫 번째 재귀: U = Promise<Promise<string>>
// 두 번째 재귀: U = Promise<string>
// 세 번째 재귀: U = string
// Result는 string

4. 기본 타입 반환

만약 U가 PromiseLike가 아니라면, 재귀 호출을 중단하고 U를 반환합니다.

5. PromiseLike가 아닐 경우 처리

입력 타입 T가 PromiseLike가 아니라면, MyAwaited는 never을 반환합니다. 이는 사용자의 입력 타입이 잘못되었음을 명확히 나타냅니다.


요약

MyAwaited는:

  1. 조건부 타입과 infer를 사용해 PromiseLike에서 내부 타입 T를 추출합니다.
  2. 내부 타입이 또 다른 PromiseLike인 경우, 재귀적으로 호출하여 가장 안쪽의 타입을 추출합니다.
  3. 만약 입력 타입이 PromiseLike가 아니면 never을 반환합니다.

이 구현은 TypeScript에서 await의 타입 추론과 유사한 동작을 하도록 설계되었습니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    answerShare answers/solutions to a question

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions