JavaScript를 아는 개발자는 TypeScript를 어떤 순서로 배우면 되나요?
JavaScript의 함수·객체·배열을 읽을 수 있다면 TypeScript는 실행 환경과 기본 타입 계약부터 시작합니다. 이후 null·unknown 검사, 타입 재사용, 외부 입력 검증을 익힌 뒤 React props·이벤트·ref로 연결합니다.
본문 근거: TypeScript Playground
TypeScript는 무엇을 추가하는가
JavaScript는 값을 실행할 때 오류를 발견하는 경우가 많습니다.
function toggleTask(task) {
return {
...task,
completed: !task.complete,
};
}
complete라는 오타가 있어도 JavaScript는 문법 오류로 막지 않습니다.
TypeScript에서는 Task 구조를 먼저 정의할 수 있습니다.
type Task = {
id: string;
title: string;
completed: boolean;
};
function toggleTask(
task: Task,
): Task {
return {
...task,
completed: !task.completed,
};
}
존재하지 않는 property를 사용하면 실행 전에 오류를 확인할 수 있습니다.
TypeScript 학습 순서
1단계: 실행 환경과 기본 타입
TypeScript 개념
→ 설치
→ tsconfig
→ strict
→ string / number / boolean
→ 배열 / 객체 / 함수
2단계: 안전한 값 처리
type vs interface
→ union
→ null / undefined
→ unknown
→ narrowing
→ keyof / typeof
→ as const
→ satisfies
3단계: 타입 재사용
generics
→ constraints
→ Partial / Pick / Omit / Record
→ mapped type
→ conditional type
→ infer
4단계: 상태와 외부 데이터
discriminated union
→ never exhaustive check
→ unknown API response
→ type guard
5단계: React 연결
tsx
→ props
→ events
→ form
→ useRef
→ optional props
→ children
→ public type design
strict 기준으로 학습하는 이유
TypeScript 7에서는 strict가 기본값입니다.
strict는 다음과 같은 검사를 묶어서 더 안전한 타입 검사를 제공합니다.
noImplicitAny
strictNullChecks
strictFunctionTypes
strictPropertyInitialization
useUnknownInCatchVariables
...
학습 과정에서 오류가 많아 보이더라도 strict를 끄기보다 왜 오류가 발생했는지 이해하는 것이 중요합니다.
타입은 runtime에 없습니다
다음 type은 JavaScript 실행 결과에 존재하지 않습니다.
type Task = {
id: string;
title: string;
};
컴파일 후 type 선언은 제거됩니다.
따라서 fetch JSON이 정말 Task인지 runtime에서 확인하려면 별도 검증이 필요합니다.
이 내용은 16회차에서 다룹니다.
React를 뒤에서 배우는 이유
TypeScript를 React와 동시에 시작하면 다음 두 종류의 문제를 구분하기 어려워집니다.
TypeScript 타입 시스템 문제
React API 사용 문제
먼저 일반 함수와 객체에서 타입을 익히면 React props, event 타입도 훨씬 쉽게 이해할 수 있습니다.
자주 하는 실수
any로 오류를 없앱니다
function parse(value: any) {
return value.title;
}
오류는 사라지지만 타입 검사도 사라집니다.
외부 입력은 unknown에서 검증하는 습관을 들입니다.
모든 곳에 타입을 직접 씁니다
TypeScript는 타입 추론을 잘합니다.
const count = 0;
굳이 다음처럼 쓸 필요는 없습니다.
const count: number = 0;
함수 경계, 객체 모델, 외부 API 같은 중요한 계약을 중심으로 타입을 작성합니다.
어려운 고급 타입부터 공부합니다
conditional type이나 infer는 기본 타입과 generic을 이해한 뒤 배우는 편이 좋습니다.
5분 시작점 진단
작은 변형: Task 타입의 completed를 done으로 바꾸고 함수는 그대로 두세요. 이번에는 completed가 없는 속성이라는 오류가 나야 합니다. 타입 정의와 사용하는 코드가 같은 계약을 따라야 함을 확인합니다.
독자 질문: 나는 이 과정의 어디서 시작하고, TypeScript가 실제로 무엇을 막아 주는지 어떻게 확인할까요?
설치 없이 TypeScript Playground에 아래 코드를 붙여 넣어 보세요.
type Task = { id: string; completed: boolean };
function toggleTask(task: Task): Task {
return { ...task, completed: !task.complete };
}
기대 결과: Task에 complete 속성이 없다는 오류가 표시됩니다. 마지막 줄의 task.complete를 task.completed로 고치면 그 오류가 사라집니다. 이 진단은 타입 검사가 실행 전에 속성 오타를 잡는다는 것만 확인합니다. 외부에서 받은 JSON이 실제 Task인지는 보장하지 않으므로 16회차에서 별도 검증을 다룹니다.
시작점: JavaScript의 함수·객체·배열·Promise가 낯설다면 그 기초부터 보완합니다. 익숙하지만 TypeScript가 처음이라면 02 차이 설명 → 03 설치·strict 실행 → 04 기본 타입 순으로 갑니다. 타입 문법은 익숙한데 API 응답을 그대로 믿는 문제가 남았다면 16회차의 unknown·type guard를 확인합니다. React 타입이 목적이라도 04~16에서 필요한 기초를 점검한 뒤 17~21로 이동합니다.
완료 기준: 오류가 난 줄과 고친 줄을 직접 보여 줄 수 있고, ‘타입 검사가 막는 오타’와 ‘실행 시 외부 데이터 확인’을 구분하며 자신의 다음 회차를 고를 수 있습니다. TaskFlow 프로젝트 파일은 필요하지 않습니다.
학습 완료 체크리스트
- TypeScript가 JavaScript에 정적 타입 검사를 추가한다는 것을 설명할 수 있습니다.
- strict 기반 학습이 필요한 이유를 설명할 수 있습니다.
- 타입과 runtime 검증이 다른 문제라는 것을 이해했습니다.
- 코어 TypeScript를 먼저 배우고 React 타입으로 연결하는 순서를 이해했습니다.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 작업을 추가·완료·삭제하는 할 일 앱입니다. 이 선택 실습에서는 JavaScript 코드를 TypeScript로 확장합니다.
22회차 동안 어떤 영역을 TypeScript로 바꿀지 정합니다.
선택: 연재 프로젝트와 전체 자료
연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.
TaskFlow 프로젝트 적용
TypeScript 실무 로드맵 · 단계별 TaskFlow
기존 JavaScript 14단계 화면을 사용하며 이번 단계는 TypeScript 문서·타입·설정을 준비합니다.
예제 크게 보기 (새 탭)변경 설명과 부분 예제를 읽은 뒤, 시작·완료 파일과 적용 순서에서 필요한 선언·import·화면 연결을 포함한 전체 파일을 확인하세요. 이번 단계의 변경 이유와 적용 위치도 함께 확인합니다.
시작본과 이번 변경
JavaScript 최종 코어 글의 javascript-step-14-final을 typescript-step-00-js-base의 시작 상태로 사용합니다.
이번 글에서는 실행 코드를 바꾸지 않고 전환 범위 문서와 체크포인트 안내를 추가합니다. 현재 코어의 tasks·CRUD·fetch 입력 경계를 목록으로 적고, 2회차에서 찾을 속성 오타와 3회차에서 추가할 타입 검사 환경을 구분합니다.
이전 체크포인트
typescript-step-00-js-base
현재 상태
JavaScript TaskFlow는 정상 동작하지만 함수와 데이터 계약이 타입으로 표현되어 있지 않습니다.
tasks
addTask
toggleTask
deleteTask
filterTasks
이번 목표
22회차 동안 어떤 영역을 TypeScript로 바꿀지 정합니다.
Before
JavaScript runtime 중심
객체 shape를 코드만 보고 추측
함수 인수 타입 제한 없음
외부 JSON 신뢰
최종 목표
Task
TaskFilter
CreateTaskInput
UpdateTaskInput
ApiResponse<T>
TaskLoadState
runtime type guard
React props/event/ref
public type boundary
현재 확장 단계
→ 1. TypeScript 전체 로드맵
○ 2. JavaScript와 차이
○ 3. TypeScript 7 설치
○ 4~9. 기본 타입·narrowing·literal
○ 10~14. generic·타입 변환
○ 15~16. 상태·runtime 검증
○ 17~21. React 연결·공개 타입
○ 22. TypeScript 7 최종 점검
중간부터 시작하는 전체 파일과 적용 순서
시작 ZIP은 직전 프로젝트 단계 javascript-step-14-final의 실제 완료 파일입니다. 프로젝트 순서를 이어가는 기준이며 사이트의 기술 읽기 순서와는 구분합니다.
- 시작 ZIP을 새 폴더에 풉니다. 이 폴더가 작업 루트이며 기존 체크포인트 파일을 별도로 찾을 필요가 없습니다.
- JavaScript 최종 코어를 그대로 시작본으로 사용하고 docs/typescript-roadmap.md에서 전환 범위와 기존 기능 보존 위치를 확인합니다. 설계 회차이므로 실행 코드 변경은 없습니다.
- 아래 변경 파일을 같은 상대 경로에 추가하거나 전체 교체합니다. 표시하지 않은 파일과 images는 시작본 그대로 유지합니다. package-lock.json은 완료 ZIP에 있는 파일을 함께 적용합니다.
- 작업 루트에서 명령을 실행하고 예상 결과를 확인합니다. 완료 ZIP은 직접 적용한 결과를 비교하는 기준입니다.
추가·교체 파일
CHANGES.md— 전체 교체README.md— 전체 교체docs/typescript-roadmap.md— 추가
실행과 확인
npm start
npm test
개발 서버는 실행 상태로 두고 다른 터미널에서 검사 명령을 실행하세요. Node.js 24.18.0에서 검증했습니다. JavaScript는 http://127.0.0.1:4173, TypeScript는 Vite 실행 출력의 주소로 접속합니다.
예상 결과: 기존 JavaScript 최종판이 그대로 실행되며 전환 체크리스트가 추가됩니다.
기존 ZIP 검증 기록: 기존 JavaScript 앱 실행 검사 통과; 타입 계약은 설치 회차부터 검사. 시작 ZIP에 이 글의 변경 파일만 적용한 결과와 완료 ZIP의 모든 파일 내용이 일치했습니다. 브라우저 화면 배치·실제 기기·외부 CDN 가용성은 이 검사에 포함하지 않았습니다.
이 절의 전체 파일은 ZIP과 일치합니다. 위쪽 원문의 짧은 예제나 생략 표시가 있는 부분 코드는 개념·변경 위치 설명용입니다. 서버 저장과 인증은 제공하지 않으며 JSON fixture는 로컬 읽기 실습용입니다.
복사할 변경 파일 전체 코드
docs/typescript-roadmap.md — 전체 파일
# TypeScript 마이그레이션
현재 JavaScript 최종판을 기준으로 Task의 id/title/completed 계약부터 전환합니다. 날짜·URL·요청취소가 있는 원본은 javascript.html에서 계속 실행할 수 있도록 보존합니다. 타입 학습용 화면은 기본 CRUD와 타입 경계를 단계별로 확장합니다. 이 글은 설계 단계이며 실행 코드의 전후 차이를 주장하지 않습니다.
완료 체크포인트
typescript-step-01-roadmap
다음 학습
다음 글에서는 TypeScript가 JavaScript와 실제로 무엇이 다른지 컴파일 시점과 runtime 관점에서 설명합니다.
다음 글: TypeScript란 무엇인가: JavaScript와 차이 정리
글 소개·학습 준비·전체 목차

TypeScript · 1 / 22 · 필수 길잡이 · 실무 로드맵
TypeScript는 어디서 시작하고 어떤 순서로 실무에 연결할까요? JavaScript 함수·객체·배열을 읽을 수 있다면 실행 환경과 기본 계약부터 시작해 narrowing·타입 재사용·외부 입력 검증으로 진행합니다. 아래 Playground 속성 오타 진단으로 현재 시작점과 다음 학습을 고릅니다.
이 과정은 React props 타입만 빠르게 훑는 과정이 아닙니다. 먼저 프레임워크와 무관한 TaskFlow Core를 JavaScript에서 TypeScript로 바꾸면서 데이터·함수·상태·외부 입력을 안전하게 모델링합니다. 이후 후반부에서 React props, event, ref, children 타입으로 연결합니다.
이번 글에서 배우는 내용
- TypeScript 과정 전체 학습 순서
- JavaScript와 TypeScript의 역할 차이
- strict 기준으로 공부하는 이유
- 기본 타입에서 고급 타입으로 가는 흐름
- runtime 데이터 검증이 별도로 필요한 이유
- React TypeScript는 왜 후반부에 배우는지
- TaskFlow가 22회 동안 어떻게 바뀌는지
단독 학습 선수 지식
JavaScript 변수·함수·객체·배열을 알면 시작점 진단을 할 수 있습니다. Promise와 모듈은 해당 후속 주제를 읽기 전에 보완합니다.
선수 지식
다음 JavaScript 문법은 알고 시작하는 편이 좋습니다.
- 변수와 함수
- 객체와 배열
- 구조 분해
- map, filter
- import / export
- Promise와 async / await 기본
- null과 undefined
과정 전체의 누적 프로젝트는 JavaScript로 동작하는 TaskFlow입니다. 이 글의 로드맵과 아래 시작점 진단은 프로젝트 파일 없이도 따라갈 수 있습니다.
tasks 배열
addTask()
toggleTask()
deleteTask()
filterTasks()
처음부터 React를 사용하지 않습니다.
목차
이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 22개 · 필수 21개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.