TypeScript/비동기/Lesson 03
Promise<T> — TypeScript 로 비동기 안전하게
30분·theory
이 챕터
3/7
TypeScript
Promise
Promise
Promise
Promise — TypeScript 로 비동기 안전하게
💡 왜 배워야 할까요? — JS Promise 에서 한 단계 위로
🎯
JS Promise 는 `.then(user => ...)` 에서 `user` 가 무엇인지 모릅니다 — IDE 자동완성 X, 오타 시 런타임에서야 폭발.
💼
TS Promise 는 `T` 자리에 '안에 담길 값의 타입' 을 박아둡니다 — IDE 가 미리 알려주고, 잘못된 사용은 컴파일이 거부합니다.
⚡
실무 API 함수 90% 가 Promise 를 반환합니다. 타입이 박힌 Promise 는 호출부 코드의 신뢰성을 결정합니다.
🔗
async/await, Promise.all 같은 도구도 타입이 박힐 때 진짜 가치가 나옵니다 (Promise.all 은 튜플 타입까지 추론).
🏢 실무에서는
Next.js·React 의 Server Component, Server Action, API 라우트는 전부 async 함수입니다. 반환 타입을 명시하지 않으면 호출부에서 매번 `as User` 같은 강제 캐스팅이 생기고, 그게 누적되면 타입 시스템이 의미를 잃습니다. 실무에서는 Promise, Promise, Promise 처럼 반환 타입을 명시하는 게 기본입니다.
Promise — 제네릭으로 '담길 값' 의 타입을 박는다
Promise 의 T 가 무엇인가
JS Promise 는 '나중에 도착할 값을 약속하는 객체' 입니다. TS Promise
T 가 박히면 무엇이 바뀌나
JS 였다면 피자.toFixed(2) 는 컴파일 통과 → 실행 시 TypeError → 운 좋게 테스트가 잡아주거나, 운 나쁘면 프로덕션에서 터집니다.
async 함수의 반환 타입은 자동으로 Promise 로 감싸진다
async 키워드가 붙은 함수는 무조건 Promise 를 반환합니다. 그래서 반환 타입에 Promise<...> 를 적어야 합니다 (또는 추론에 맡깁니다).
타입 명시 vs 타입 추론
실무에서는 둘 다 씁니다:
Promise.all 은 튜플 타입까지 추론한다
JS 에서는 결과 배열을 받아도 각 원소의 타입을 알 수 없습니다. TS 는 위치별 타입을 보존합니다.
💡 💡 JS ↔ TS 핵심 차이
1. new Promise() 에는 항상 <T> 를 박아라
2. async 함수의 반환 타입은 명시하는 게 좋다
공개 API 함수는 시그니처만 봐도 의도가 드러나야 합니다.
3. Promise.all 의 결과는 튜플로 받아라
4. catch 의 에러는 unknown 이다 (TS 4.4+)
5. 제네릭 헬퍼는 한 번 만들면 평생 쓴다
⚡ 직접 실행해보기 — Promise (타입을 뗀 실행 버전)
위 🅱️ TS 코드에서 **타입 표기만 떼어낸 실행 가능 버전**입니다. 런타임 동작은 같아요 — 차이는 IDE 가 잡아주냐 vs 실행 시점에 터지냐 입니다.
💡 진짜 TS 컴파일러로 돌려보고 싶다면 → [TypeScript Playground](https://www.typescriptlang.org/play) 에 위 🅱️ 코드를 붙여넣으세요.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
TypeScript 에서 `Promise<User>` 의 `<User>` 가 의미하는 것은?
먼저 읽으면 좋은 개념: 이벤트 루프 — Microtask vs Macrotask