PromiseLikePromise 인스턴스의 타입에서 catch 메서드만 제외하고 동일합니다. 따라서 ((value: T) => TResult1 | PromiseLike<TResult1>) 중에서 onfulfilled 함수의 타입은 (value: T) => TResult1이고, onfulfilled의 반환값은 123입니다. 따라서 반환값의 타입인 TResult1 | PromiseLike<TResult1>)에서 TResult1number가 됩니다. 123Promise가 아니니까요.

    then 메서드의 반환값은 Promise<TResult1 | TResult2>이므로 Promise<number | never>이고, 최종적으로 Promise<number>가 됩니다.

    const chaining = await Promise.resolve('hi')
      .then(() => {
        return 123;
      })
      .then(() => {
        return true;
      })
    // const chaining: boolean
    ...
    

    두 번째 then이 붙을 때는 Promise<number>에 대해 TResult1true일 것이므로 Promise<TResult | TResult2>Promise<boolean>이 됩니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.