TypeScript/비동기/Lesson 01
동기 vs 비동기 — TS 는 콜백 시그니처까지 보호한다
25분·theory
이 챕터
1/7
TypeScript
동기 vs 비동기 — TS 는 콜백 시그니처까지 보호한다
💡 왜 배워야 할까요? — 동기·비동기는 같지만, 안전망이 다르다
🎯
동기·비동기의 런타임 동작은 JS 와 TS 가 동일합니다 — 차이는 '콜백·결과의 타입을 누가 보장하느냐' 입니다.
💼
JS 는 `setTimeout(cb, 1000)` 의 `cb` 가 어떤 인자를 받는지 모릅니다. TS 는 콜백 시그니처를 타입으로 박을 수 있습니다.
⚡
비동기 함수가 무엇을 돌려주는지 (`Promise` 인지 `Promise` 인지) 시그니처에 박아두면, 호출부 코드가 자동완성 됩니다.
🔗
Node.js 와 브라우저의 `setTimeout` 반환값 타입이 다릅니다 (`NodeJS.Timeout` vs `number`) — TS 는 이걸 환경별로 정확히 추론합니다.
🏢 실무에서는
이벤트 핸들러·타이머·API 호출은 전부 콜백을 받습니다. JS 에서는 콜백 안에서 `e.target.value` 같은 코드를 쓰다 오타로 `e.target.valeu` 가 되어도 런타임에서야 발견됩니다. TS 는 `(e: React.ChangeEvent) => void` 처럼 타입을 박아서 IDE 자동완성·오타 차단·구조 변경 자동 추적을 다 제공합니다.
동기·비동기는 같지만, 콜백 타입이 다르다
1. 런타임 동작은 동일
TS 든 JS 든 이 동작은 같습니다. TS 는 컴파일 후 타입을 떼고 JS 로 실행되니까요.
2. 차이는 '콜백·반환값 타입' 명시
3. 비동기 함수의 반환 타입을 박는다
4. setTimeout 의 반환값은 환경별로 다르다 — 한 코드는 한 환경에서만 안전
> 💡 라이브러리·범용 모듈을 만들 때는 무조건 ReturnType<typeof setTimeout>. 앱 코드처럼 환경이 확정된 곳에서만 number 나 NodeJS.Timeout 을 직접 적어도 됩니다.
💡 💡 JS ↔ TS 핵심 차이 (동기/비동기)
1. 콜백을 받는 함수는 콜백 시그니처를 인자 타입에 박아라
2. 비동기 함수는 반환 타입을 시그니처에 박아라
3. 타이머 ID 는 ReturnType<typeof setTimeout> 으로 받아라
브라우저는 number, Node 는 NodeJS.Timeout — 환경 무관하게 안전.
4. 비동기 결과를 그냥 any 로 흘리지 마라res.json() 의 기본 반환은 Promise<any>. 캐스트하든 zod 같은 검증으로 좁히든, 경계에서 타입을 박는 게 핵심.
5. 콜백 헬은 JS·TS 둘 다 같은 답: async/await
TS 는 async/await 의 추론을 더 잘 받쳐줍니다. 이미 promise lesson 에서 다룬 내용.
⚡ 직접 실행해보기 — 동기 vs 비동기
위 🅱️ TS 코드에서 타입을 뗀 실행 버전. 동작 자체는 JS·TS 가 동일하다는 걸 확인합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
TS 에서 브라우저·Node 양쪽에서 안전하게 타이머 ID 를 받으려면?
먼저 읽으면 좋은 개념: TypeScript 최소 기초 — 타입 에러 읽기 · any 회피