TypeScript는 JavaScript와 무엇이 다르며 어디까지 검사하나요?
TypeScript는 JavaScript에 정적 타입 검사를 더해 실행 전 인수와 속성의 오류를 찾습니다. 값을 자동으로 변환하거나 외부 JSON을 실행 중 검증하는 도구는 아닙니다.
적용 조건·범위: TypeScript 코드는 최종적으로 JavaScript로 변환되거나, bundler 환경에서는 타입 검사와 변환 과정을 거쳐 JavaScript runtime에서 실행됩니다.
공식 문서 참고: TypeScript 핸드북: 정적 검사와 런타임의 경계
직접 확인: 타입 오류와 수정
TypeScript란 무엇인가: JavaScript와 차이 정리 · 독립 실습
얻을 결과: 문자열 인수 오류 TS2345를 확인하고 Number()로 값을 실제 변환해 타입 검사를 통과합니다.
예제 크게 보기 (새 탭)단독 검사는 tsconfig.json이 없는 새 폴더에서 example.ts 한 파일씩 교체하며 진행합니다. TypeScript가 없다면 설치 글에서 Node.js/npm·TypeScript 준비를 확인하세요. 타입 검사 성공은 코드 실행 성공과 구분합니다.
독자 질문: TypeScript는 어떤 실수를 실행 전에 찾고, 어떤 문제는 직접 검사해야 할까요?
얻을 결과: 문자열 인수 오류 TS2345를 확인하고 Number()로 값을 실제 변환해 타입 검사를 통과합니다.
다음 코드를 별도 example.ts에 복사합니다.
function add(a: number, b: number): number { return a + b; }
add('1', 2);
예상 오류: TS2345: string 인수는 number 매개변수에 전달할 수 없습니다.
오류 예제를 아래 코드로 교체합니다.
function add(a: number, b: number): number { return a + b; }
console.log(add(Number('1'), 2));
npx tsc --strict --noEmit example.ts
기존 최소 예제 확인 기록: 별도 최소 파일을 TypeScript 7.0.2에서 --strict --noEmit으로 검사: 오류 예제는 TS2345, 수정 예제는 exit 0. TaskFlow 체크포인트와 Playground 조작은 미확인.
타입 단언(as)은 값 변환이 아니며 API·localStorage 값은 실행 시 검사해야 합니다.
다음 학습: 03회차에서 로컬 설치·tsconfig·strict를 직접 설정하고 npx tsc --noEmit을 실행합니다.
JavaScript는 동적 타입 언어입니다
let value = 10;
value = 'hello';
JavaScript에서는 변수에 다른 타입의 값을 다시 넣을 수 있습니다.
함수도 호출 전에 인수 타입을 검사하지 않습니다.
function add(a, b) {
return a + b;
}
add(1, 2);
add('1', 2);
두 호출 모두 실행됩니다.
TypeScript는 정적 타입 검사를 추가합니다
function add(
a: number,
b: number,
): number {
return a + b;
}
다음 호출은 타입 오류입니다.
add('1', 2);
실행 전에 “첫 번째 인수는 number여야 한다”는 계약을 확인할 수 있습니다.
TypeScript는 JavaScript의 superset입니다
대부분의 올바른 JavaScript 문법은 TypeScript에서도 사용할 수 있습니다.
여기에 다음 문법이 추가됩니다.
type User = {
id: string;
name: string;
};
function getName(
user: User,
): string {
return user.name;
}
type 선언은 타입 검사에 사용되고 runtime JavaScript에는 남지 않습니다.
컴파일 시점과 runtime
TypeScript가 검사할 수 있는 것:
잘못된 property 이름
잘못된 함수 인수
null 가능성
반환 타입 불일치
union 처리 누락
runtime에서만 알 수 있는 것:
API 서버가 500 반환
사용자가 잘못된 JSON 입력
localStorage 내용이 예상과 다름
네트워크 연결 끊김
DOM이 실제로 존재하지 않음
TypeScript가 있다고 runtime 오류가 모두 사라지는 것은 아닙니다.
타입 추론
TypeScript는 많은 타입을 자동으로 추론합니다.
const title = '공부하기';
이 const 변수 자체는 ‘공부하기’ 문자열 리터럴 타입으로 추론됩니다. 객체의 변경 가능한 문자열 프로퍼티는 보통 string으로 넓어집니다.
const task = {
id: '1',
title: '공부하기',
completed: false,
};
각 property 타입도 추론됩니다.
모든 변수에 타입을 반복 작성할 필요는 없습니다.
타입을 명시할 가치가 높은 위치
다음 경계는 명시적 타입이 유용합니다.
함수 매개변수
function deleteTask(
id: string,
) {
...
}
공개 반환 타입
function getTasks(): Task[] {
...
}
도메인 객체
type Task = {
id: string;
title: string;
completed: boolean;
};
외부 데이터 경계
외부 데이터는 unknown으로 받은 뒤 검증하는 구조가 좋습니다.
오류 예제
type Task = {
id: string;
completed: boolean;
};
const task: Task = {
id: '1',
completed: false,
};
console.log(task.complete);
complete property는 존재하지 않기 때문에 TypeScript가 오류를 표시합니다.
JavaScript에서는 실행 후 undefined가 나올 수 있는 문제를 미리 찾은 것입니다.
TypeScript가 타입을 강제로 바꾸지는 않습니다
다음 코드는 runtime 값을 number로 변환하지 않습니다.
const value =
'10' as unknown as number;
Type assertion은 컴파일러에게 타입 정보를 강제로 알려주는 문법이지 실제 값을 변환하는 함수가 아닙니다.
실제 변환:
const value =
Number('10');
타입과 runtime 값을 구분합니다.
자주 하는 오해
TypeScript면 버그가 없어집니다
아닙니다.
비즈니스 로직 오류와 runtime 데이터 오류는 여전히 발생할 수 있습니다.
타입을 많이 쓰면 더 좋은 코드입니다
중요한 것은 타입 수가 아니라 실제 계약을 정확하게 표현하는 것입니다.
as를 쓰면 값이 변환됩니다
as는 runtime 변환이 아닙니다.
학습 완료 체크리스트
Number("abc")도 타입 검사는 통과하는데 결과가 NaN인 이유를 설명해 보세요. 타입 단언, 실제 변환, 외부 데이터의 구조 검증을 같은 동작으로 취급하지 않아야 합니다.
작은 변형으로 확인하기
Number('1')을 Number('abc')로 바꾸면 타입 검사는 통과해도 계산은 NaN입니다. 문자열 인수의 타입 오류와 실행 시 잘못된 숫자 변환을 구분하세요.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 작업을 추가·완료·삭제하는 할 일 앱입니다. 이 선택 실습에서는 JavaScript 코드를 TypeScript로 확장합니다.
TaskFlow JavaScript 코드에서 TypeScript가 미리 찾을 수 있는 대표 문제를 확인합니다.
선택: 연재 프로젝트와 전체 자료
연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.
TaskFlow 프로젝트 적용
TypeScript란 무엇인가: JavaScript와 차이 정리 · 단계별 TaskFlow
기존 JavaScript 14단계 화면을 사용하며 이번 단계는 TypeScript 문서·타입·설정을 준비합니다.
예제 크게 보기 (새 탭)변경 설명과 부분 예제를 읽은 뒤, 시작·완료 파일과 적용 순서에서 필요한 선언·import·화면 연결을 포함한 전체 파일을 확인하세요. 이번 단계의 변경 이유와 적용 위치도 함께 확인합니다.
시작본과 이번 변경
TypeScript 실무 로드맵의 완료 체크포인트를 기준으로 이어갑니다. 변경하지 않는 파일은 그 시작 상태를 유지합니다.
이번 회차는 파일을 전환하기 전 진단입니다. 기존 toggleTask의 complete 오타를 찾고 completed로 수정했을 때 결과를 예측합니다. 타입 계약 파일은 아래 완료본에 미리 두고, 설치와 프로젝트 타입 검사 실행은 다음 회차에서 진행합니다.
이전 체크포인트
typescript-step-01-roadmap
이번 목표
TaskFlow JavaScript 코드에서 TypeScript가 미리 찾을 수 있는 대표 문제를 확인합니다.
JavaScript 예제
const task = {
id: '1',
title: 'TypeScript 공부',
completed: false,
};
function toggleTask(task) {
return {
...task,
completed:
!task.complete,
};
}
property 오타가 있어도 실행 전에는 알기 어렵습니다.
TypeScript 목표
다음 회차 설치 후 Task type을 추가하면 이런 오류를 컴파일 단계에서 확인할 수 있습니다.
type Task = {
id: string;
title: string;
completed: boolean;
};
이번 회차에서는 아직 설치하지 않습니다.
중간부터 시작하는 전체 파일과 적용 순서
시작 ZIP은 직전 프로젝트 단계 typescript-step-01-roadmap의 실제 완료 파일입니다. 프로젝트 순서를 이어가는 기준이며 사이트의 기술 읽기 순서와는 구분합니다.
- 시작 ZIP을 새 폴더에 풉니다. 이 폴더가 작업 루트이며 기존 체크포인트 파일을 별도로 찾을 필요가 없습니다.
- src/types/task.ts에 Task 계약을 추가합니다. 이 단계에서는 JS 화면은 유지하며 다음 설치 회차부터 타입 검사를 실행합니다.
- 아래 변경 파일을 같은 상대 경로에 추가하거나 전체 교체합니다. 표시하지 않은 파일과 images는 시작본 그대로 유지합니다. package-lock.json은 완료 ZIP에 있는 파일을 함께 적용합니다.
- 작업 루트에서 명령을 실행하고 예상 결과를 확인합니다. 완료 ZIP은 직접 적용한 결과를 비교하는 기준입니다.
추가·교체 파일
CHANGES.md— 전체 교체README.md— 전체 교체src/types/task.ts— 추가docs/type-contract.md— 추가
실행과 확인
npm start
npm test
개발 서버는 실행 상태로 두고 다른 터미널에서 검사 명령을 실행하세요. Node.js 24.18.0에서 검증했습니다. JavaScript는 http://127.0.0.1:4173, TypeScript는 Vite 실행 출력의 주소로 접속합니다.
예상 결과: Task 계약 파일과 JavaScript 최종판을 함께 확인합니다. TypeScript 파일은 아직 브라우저에서 직접 실행하지 않습니다.
기존 ZIP 검증 기록: 기존 JavaScript 앱 실행 검사 통과; 타입 계약은 설치 회차부터 검사. 시작 ZIP에 이 글의 변경 파일만 적용한 결과와 완료 ZIP의 모든 파일 내용이 일치했습니다. 브라우저 화면 배치·실제 기기·외부 CDN 가용성은 이 검사에 포함하지 않았습니다.
이 절의 전체 파일은 ZIP과 일치합니다. 위쪽 원문의 짧은 예제나 생략 표시가 있는 부분 코드는 개념·변경 위치 설명용입니다. 서버 저장과 인증은 제공하지 않으며 JSON fixture는 로컬 읽기 실습용입니다.
복사할 변경 파일 전체 코드
src/types/task.ts — 전체 파일
export type Task = {
id: string;
title: string;
completed: boolean;
};
docs/type-contract.md — 전체 파일
# 첫 타입 계약
Task는 id:string, title:string, completed:boolean입니다. 현재 JS 실행은 그대로 유지하며 다음 설치 단계에서 이 계약을 컴파일러로 검사합니다.
완료 체크포인트
typescript-step-02-intro
다음 학습
다음 글에서는 TypeScript 7을 설치하고 tsconfig를 생성한 뒤 첫 .ts 파일을 strict 기준으로 검사합니다.
다음 글: TypeScript 7 설치와 tsconfig: strict 첫 실행
글 소개·학습 준비·전체 목차

TypeScript · 2 / 22 · 필수 학습 · JavaScript와 차이
TypeScript는 JavaScript와 무엇이 다르고 무엇까지 검사할까요? JavaScript에 정적 타입 계약을 더해 실행 전 인수·속성 오류를 찾지만 값을 자동 변환하거나 외부 데이터를 실행 중 검증하지는 않습니다. 숫자 인수 오류와 Number 변환 예제로 검사와 실제 값의 차이를 확인합니다.
TypeScript 코드는 최종적으로 JavaScript로 변환되거나, bundler 환경에서는 타입 검사와 변환 과정을 거쳐 JavaScript runtime에서 실행됩니다.
이번 글에서 배우는 내용
- TypeScript와 JavaScript 관계
- 정적 타입 검사
- 컴파일 시점과 runtime 차이
- 타입 추론
- 타입 오류와 runtime 오류 차이
- TypeScript가 해결하지 못하는 문제
단독 학습 선수 지식
JavaScript 변수·함수와 숫자/문자열 연산을 알면 됩니다. 이전 TaskFlow 파일 없이 직접 확인 예제로 학습할 수 있습니다.
목차
이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 22개 · 필수 21개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.