PromiseLike는 Promise 인스턴스의 타입에서 catch 메서드만 제외하고 동일합니다. 따라서 ((value: T) => TResult1 | PromiseLike<TResult1>) 중에서 onfulfilled 함수의 타입은 (value: T) => TResult1이고, onfulfilled의 반환값은 123입니다. 따라서 반환값의 타입인 TResult1 | PromiseLike<TResult1>)에서 TResult1이 number가 됩니다. 123은 Promise가 아니니까요.
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>에 대해 TResult1이 true일 것이므로 Promise<TResult | TResult2>는 Promise<boolean>이 됩니다.