첫 번째 타입스크립트 프로그램 작성
변수와 함수에 타입을 붙인 첫 TypeScript 파일을 검사·컴파일하고 생성된 JavaScript를 실행하는 흐름을 확인합니다.
이 절에서는 첫 번째 타입스크립트 프로그램을 작성하면서 타입 검사, 컴파일, 자바스크립트 실행 흐름을 확인합니다.
첫 프로그램은 네 경계를 따로 확인한다 — 상태 추적
첫 프로그램 작성·진단/방출·JS 실행에서 파일과 결과의 상태가 바뀐다. 같은 소스/출력/실행 역할로 실제 관찰 값을 비교할 수 있다.
TYPE / RUNTIME / CONTRACT
첫 프로그램의 검사 · 출력 · 실행을 따로 확인한다
원문 명령은 tsc first-program.ts로 파일을 직접 지정합니다. TypeScript 6.0 이상에서 tsconfig가 있는 폴더라면 TS5112로 중단되므로 본문의 프로젝트 경로를 사용합니다. 프로젝트 정책을 적용하려면 tsc -p .과 noEmitOnError를 사용합니다. 어느 경로를 택하든 생성된 JavaScript의 실행 결과는 별도로 확인합니다.
ACTUAL SOURCE
매개변수와 반환값은 명시, 결과는 추론
createWelcomeMessage(name:string,year:number):string와 appName/currentYear/isActive를 작성합니다. greeting의 string 타입은 반환값에서 추론합니다.
ACTUAL COMMAND / FILE MODE
tsc first-program.ts는 파일 지정 경로
5.x의 파일 지정 명령은 tsconfig를 무시하며, 6.0 이상에서 설정 파일이 있으면 TS5112로 중단됩니다. 6.0 이상의 명시적 --ignoreConfig 실험도 설정을 적용하지 않습니다. 기본 정책에서는 타입 오류가 있어도 JavaScript가 출력될 수 있습니다. 문자열 invalidYear 예제는 주석을 해제할 때 진단을 보여줍니다.
PROJECT POLICY / ALTERNATIVE
tsc -p . --noEmitOnError로 설정을 적용
프로젝트의 대상과 옵션을 적용하고 오류가 있는 출력을 막습니다. 검사만 필요하면 --noEmit을 사용합니다. 새 출력 실패가 이미 남은 이전 JavaScript를 자동으로 지우는 것은 아닙니다.
ACTUAL OUTPUT
2025 안내문과 Active 상태 두 줄
node first-program.js는 Explorer와 TypeScript Journey가 포함된 welcome, Active for 2025 year 두 줄을 출력합니다. 이 고정 예제의 실행 결과와 컴파일 진단을 따로 확인합니다.
first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해2025 welcome/status두 줄을 확인한다.
이 예의 조건
- 원도표의 전체 구조와 설명은 위 관계도와 표에서 유지합니다. 아래 인쇄 표에도 원도표의 관계·조건·라벨·설명·주석을 보존합니다.
- 두 관찰 칸의 위치는 고정입니다. 관찰 상태는 해당 순간의 값이며, 동작·이유는 그 조건에서의 판정과 변화 원인입니다. 독립 비교와 실패 분기는 별도 조건으로 읽고 모든 분기를 한 요청의 필수 실행 순서로 이어 읽지 않습니다.
관계도의 보충 설명
| 구분 | 내용 |
|---|---|
| 원도표 캡션 | first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해 2025 welcome/status 두 줄을 확인한다. |
| 전체 관계·조건 설명 | 작성→검사와 출력 정책→실제 JavaScript 실행의 노드 3개·간선 2개다. TypeScript 6 설정 파일이 있는 폴더의 파일 지정 명령은 TS5112로 중단될 수 있으므로 프로젝트 경로를 구분한다. 고정 2025 예제의 두 줄 출력과 진단을 따로 확인한다. |
| 전체 관계·조건 설명 | 작성→검사와 출력 정책→실제 JavaScript 실행의 노드 3개·간선 2개다. TypeScript 6 설정 파일이 있는 폴더의 파일 지정 명령은 TS5112로 중단될 수 있으므로 프로젝트 경로를 구분한다. 고정 2025 예제의 두 줄 출력과 진단을 따로 확인한다. 모바일에서도 노드와 연결 방향·독립 경로가 같다. |
| 원도표 설명 | createWelcomeMessage(name:string,year:number):string과 appName/currentYear/isActive를 작성합니다. greeting의 string 타입은 반환값에서 추론합니다. |
| 원도표 설명 | 5.x의 파일 지정 명령은 tsconfig를 무시하며, 6.0 이상에서 설정 파일이 있으면 TS5112로 중단됩니다. 6.0 이상의 명시적 --ignoreConfig 실험도 설정을 적용하지 않습니다. 기본 정책에서는 타입 오류가 있어도 JavaScript가 출력될 수 있습니다. 문자열 invalidYear 예제는 주석을 해제할 때 진단을 보여 줍니다. |
| 장면 | 현재 관찰값 | 설명 | 변화 이유 |
|---|---|---|---|
| 소스 작성 | 소스: first-program.ts / 고정 예제: Explorer · 2025 | 첫 TypeScript 파일에 현재 프로그램을 작성한다 | source와 실행 산출물은 서로 다른 파일이다 |
| 검사와 방출 | 진단: 타입 검사 결과 / 출력: 설정상 허용된 JS | 설정과 진단 및 emit 정책을 적용한다 | 타입 검사 성공 여부와 emit 정책을 분리한다 |
| 실행 | 실행 파일: first-program.js / 출력: welcome·Active 안내 2줄 | Node가 방출된 JavaScript를 실행해 실제 출력값을 만든다 | tsc 실행과 프로그램 실행은 별개이며 실제 파일 경로를 사용한다 |
첫 프로그램은 네 경계를 따로 확인한다 — 상태 추적
첫 프로그램 작성·진단/방출·JS 실행에서 파일과 결과의 상태가 바뀐다. 같은 소스/출력/실행 역할로 실제 관찰 값을 비교할 수 있다.
TYPE / RUNTIME / CONTRACT
첫 프로그램의 검사 · 출력 · 실행을 따로 확인한다
원문 명령은 tsc first-program.ts로 파일을 직접 지정합니다. TypeScript 6.0 이상에서 tsconfig가 있는 폴더라면 TS5112로 중단되므로 본문의 프로젝트 경로를 사용합니다. 프로젝트 정책을 적용하려면 tsc -p .과 noEmitOnError를 사용합니다. 어느 경로를 택하든 생성된 JavaScript의 실행 결과는 별도로 확인합니다.
ACTUAL SOURCE
매개변수와 반환값은 명시, 결과는 추론
createWelcomeMessage(name:string,year:number):string와 appName/currentYear/isActive를 작성합니다. greeting의 string 타입은 반환값에서 추론합니다.
ACTUAL COMMAND / FILE MODE
tsc first-program.ts는 파일 지정 경로
5.x의 파일 지정 명령은 tsconfig를 무시하며, 6.0 이상에서 설정 파일이 있으면 TS5112로 중단됩니다. 6.0 이상의 명시적 --ignoreConfig 실험도 설정을 적용하지 않습니다. 기본 정책에서는 타입 오류가 있어도 JavaScript가 출력될 수 있습니다. 문자열 invalidYear 예제는 주석을 해제할 때 진단을 보여줍니다.
PROJECT POLICY / ALTERNATIVE
tsc -p . --noEmitOnError로 설정을 적용
프로젝트의 대상과 옵션을 적용하고 오류가 있는 출력을 막습니다. 검사만 필요하면 --noEmit을 사용합니다. 새 출력 실패가 이미 남은 이전 JavaScript를 자동으로 지우는 것은 아닙니다.
ACTUAL OUTPUT
2025 안내문과 Active 상태 두 줄
node first-program.js는 Explorer와 TypeScript Journey가 포함된 welcome, Active for 2025 year 두 줄을 출력합니다. 이 고정 예제의 실행 결과와 컴파일 진단을 따로 확인합니다.
first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해2025 welcome/status두 줄을 확인한다.
이 예의 조건
- 원도표의 전체 구조와 설명은 위 관계도와 표에서 유지합니다. 아래 인쇄 표에도 원도표의 관계·조건·라벨·설명·주석을 보존합니다.
- 두 관찰 칸의 위치는 고정입니다. 관찰 상태는 해당 순간의 값이며, 동작·이유는 그 조건에서의 판정과 변화 원인입니다. 독립 비교와 실패 분기는 별도 조건으로 읽고 모든 분기를 한 요청의 필수 실행 순서로 이어 읽지 않습니다.
관계도의 보충 설명
| 구분 | 내용 |
|---|---|
| 원도표 캡션 | first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해 2025 welcome/status 두 줄을 확인한다. |
| 전체 관계·조건 설명 | 작성→검사와 출력 정책→실제 JavaScript 실행의 노드 3개·간선 2개다. TypeScript 6 설정 파일이 있는 폴더의 파일 지정 명령은 TS5112로 중단될 수 있으므로 프로젝트 경로를 구분한다. 고정 2025 예제의 두 줄 출력과 진단을 따로 확인한다. |
| 전체 관계·조건 설명 | 작성→검사와 출력 정책→실제 JavaScript 실행의 노드 3개·간선 2개다. TypeScript 6 설정 파일이 있는 폴더의 파일 지정 명령은 TS5112로 중단될 수 있으므로 프로젝트 경로를 구분한다. 고정 2025 예제의 두 줄 출력과 진단을 따로 확인한다. 모바일에서도 노드와 연결 방향·독립 경로가 같다. |
| 원도표 설명 | createWelcomeMessage(name:string,year:number):string과 appName/currentYear/isActive를 작성합니다. greeting의 string 타입은 반환값에서 추론합니다. |
| 원도표 설명 | 5.x의 파일 지정 명령은 tsconfig를 무시하며, 6.0 이상에서 설정 파일이 있으면 TS5112로 중단됩니다. 6.0 이상의 명시적 --ignoreConfig 실험도 설정을 적용하지 않습니다. 기본 정책에서는 타입 오류가 있어도 JavaScript가 출력될 수 있습니다. 문자열 invalidYear 예제는 주석을 해제할 때 진단을 보여 줍니다. |
| 장면 | 현재 관찰값 | 설명 | 변화 이유 |
|---|---|---|---|
| 소스 작성 | 소스: first-program.ts / 고정 예제: Explorer · 2025 | 첫 TypeScript 파일에 현재 프로그램을 작성한다 | source와 실행 산출물은 서로 다른 파일이다 |
| 검사와 방출 | 진단: 타입 검사 결과 / 출력: 설정상 허용된 JS | 설정과 진단 및 emit 정책을 적용한다 | 타입 검사 성공 여부와 emit 정책을 분리한다 |
| 실행 | 실행 파일: first-program.js / 출력: welcome·Active 안내 2줄 | Node가 방출된 JavaScript를 실행해 실제 출력값을 만든다 | tsc 실행과 프로그램 실행은 별개이며 실제 파일 경로를 사용한다 |
타입스크립트 파일 만들기
먼저, 여러분이 환경 설정을 위해 만들었던 my-ts-project 폴더를 VS Code로 열어주세요.
만약 새로운 프로젝트를 시작하고 싶다면, 이전 절의 지침에 따라 새 폴더를 만들고 tsc --init 명령어로 tsconfig.json 파일을 생성한 후 진행하셔도 좋습니다.
이제 이 폴더 안에 first-program.ts라는 새 파일을 생성해봅시다.
파일명은 자유롭게 정해도 되지만, 일반적으로 타입스크립트 파일은 .ts 확장자를 사용합니다.
간단한 함수와 변수에 타입 적용하기
first-program.ts 파일에 다음 코드를 작성해보세요.
한 줄씩 살펴보면서 타입스크립트가 어떻게 동작하는지 이해하는 것이 중요합니다.
// 1. 변수에 타입 명시하기
let appName: string = "TypeScript Journey";
let currentYear: number = 2025;
let isActive: boolean = true;
// 2. 함수에 타입 명시하기 (매개변수와 반환 값)
function createWelcomeMessage(name: string, year: number): string {
return `Hello, ${name}! We are embarking on the ${year} ${appName}.`;
}
// 3. 타입 추론 (Type Inference) 살펴보기
let greeting = createWelcomeMessage("Explorer", currentYear);
// VS Code에서 'greeting' 변수에 마우스를 올려보세요.
// string 타입으로 자동으로 추론되었음을 확인할 수 있습니다.
// 4. 의도적인 오류 발생시켜보기
// 아래 줄의 주석을 해제하고 어떤 오류 메시지가 뜨는지 확인해보세요.
// let invalidYear: number = "Two Thousand Twenty-Five";
// Type 'string' is not assignable to type 'number'. (string 형식을 number 형식에 할당할 수 없습니다.)
// 5. 타입스크립트 코드 실행 결과 확인
console.log(greeting);
if (isActive) {
console.log(`Current application status: Active for ${currentYear} year.`);
}코드를 작성하셨다면, 몇 가지 중요한 포인트를 짚어보겠습니다.
-
변수 타입 명시 (
:연산자):let appName: string = "TypeScript Journey";처럼 변수 이름 뒤에 콜론(:)으로 타입을 명시했습니다. 이는appName변수가 문자열(string) 값만 가질 수 있음을 의미합니다. 숫자나 불리언 값을 할당하려 하면 VS Code가 즉시 오류를 표시해 줍니다.number,boolean타입도 같은 방식으로 동작합니다. -
함수 매개변수 및 반환값 타입 명시:
function createWelcomeMessage(name: string, year: number): string { ... }에서name: string과year: number는 함수 매개변수의 타입을 명시합니다. 함수 괄호 뒤의: string은 이 함수가 문자열(string)을 반환해야 함을 나타냅니다. -
타입 추론 (Type Inference):
let greeting = createWelcomeMessage("Explorer", currentYear);줄을 보면greeting변수에 타입을 직접 쓰지 않았습니다. 하지만 VS Code에서greeting위에 마우스를 올리면, 이 변수가string타입으로 추론되었음을 확인할 수 있습니다. 타입스크립트는 모든 타입을 수동으로 쓰지 않아도, 할당값과 반환값을 보고 타입을 추론합니다. 덕분에 코드가 간결해지면서도 타입 안정성을 유지할 수 있습니다. -
컴파일 시점의 오류 검출: 주석 처리된
let invalidYear: number = "Two Thousand Twenty-Five";줄의 주석을 해제하면 VS Code가 즉시 빨간 줄과 오류 메시지를 보여줍니다. Type 'string' is not assignable to type 'number'. 즉, 문자열은 숫자에 할당될 수 없다는 의미입니다. 이처럼 타입스크립트는 실행 전에 잠재적 오류를 알려 런타임 문제를 미리 방지합니다.
컴파일하고 실행하기
이제 작성한 first-program.ts 파일을 자바스크립트로 변환(컴파일)하고 실행해봅시다.
터미널 열기:
VS Code의 상단 메뉴에서 터미널(Terminal) -> 새 터미널(New Terminal)을 선택하여 터미널을 엽니다.
타입스크립트 컴파일:
아래 원문은 파일을 직접 지정하는 경로입니다. TypeScript 6.0 이상에서 tsconfig.json이 있는 폴더라면 이 명령은 TS5112 진단으로 중단됩니다. 이때는 절 끝의 tsc -p . 프로젝트 경로를 사용하세요. TypeScript 5.x의 파일 지정 경로는 설정 파일을 무시했으므로 두 경우를 구별해야 합니다.
tsc first-program.ts파일 지정 경로에서 검사가 진행되고 출력이 허용된 경우 first-program.ts와 동일한 폴더에 first-program.js가 생성됩니다. TS5112로 중단된 경우에는 새 출력이 생기지 않습니다.
이 first-program.js 파일은 여러분이 작성한 타입스크립트 코드가 순수한 자바스크립트로 변환된 결과물입니다.
VS Code에서 first-program.js 파일을 열어보면 타입 정보가 모두 제거된 것을 확인할 수 있습니다.
만약 tsc 명령어만 입력하면, tsconfig.json 파일 설정에 따라 프로젝트 내의 모든 .ts 파일을 컴파일합니다.
5.x의 파일 지정 경로 또는 6.0 이상의 명시적 --ignoreConfig 경로는 tsconfig.json을 사용하지 않습니다. 기본 설정에서는 타입 오류가 있어도 JavaScript가 출력될 수 있습니다. 상단 그림의 프로젝트 정책을 적용할 때는 tsc -p . --noEmitOnError로 설정 파일의 대상과 옵션을 적용하고 오류가 있는 emit을 막습니다.
자바스크립트 파일 실행: 이제 컴파일된 자바스크립트 파일을 Node.js 런타임을 사용하여 실행합니다.
node first-program.js터미널에 다음과 같은 메시지가 출력될 것입니다.
Hello, Explorer! We are embarking on the 2025 TypeScript Journey.
Current application status: Active for 2025 year.첫 번째 타입스크립트 프로그램에서 작성, 타입 검사, 자바스크립트 변환, 실행 결과 확인 흐름을 점검했습니다.
위 2025는 원문 예제의 고정 입력값입니다. 현재 연도를 자동으로 읽는 프로그램이 아니므로 실행 날짜에 따라 출력이 바뀌지 않습니다.
이후 장에서는 이 기본 흐름을 바탕으로 타입스크립트의 주요 기능과 적용 기준을 더 자세히 다룹니다.
다음 장에서는 타입스크립트의 핵심 개념인 타입 시스템에 대해 더 자세히 알아보겠습니다.
기본 타입부터 복잡한 타입까지, 타입을 정의하고 활용하는 방법을 살펴봅니다.
프로젝트 경로를 선택했다면
앞 절의 별도 ts-first-isolated 설정을 사용했다면 include를 ["first-program.ts"]로 바꾸고, 현재 원문 코드를 그 파일에 저장합니다. 이 파일을 검사·출력할 때는 파일명을 CLI에 덧붙이지 않습니다.
tsc -p . --noEmit
tsc -p .
node dist/first-program.jstsc first-program.ts는 앞의 파일 지정 예제입니다. TypeScript 6.0 이상은 설정 파일이 있는 폴더에서 이를 TS5112로 중단합니다. 설정을 무시하는 별도 실험이 목적일 때만 6.0 이상의 tsc --ignoreConfig first-program.ts를 사용하며, 이 명령에는 프로젝트의 검사·출력 옵션이 적용되지 않습니다. tsc -p . first-program.ts처럼 두 선택을 한 명령에 섞지도 않습니다. 어느 경로를 사용했는지와 새 출력 파일의 위치를 함께 확인하세요.
스스로 확인하기
검사가 성공한 상태에서 currentYear를 2026으로, isActive를 false로 바꾸세요. greeting의 추론 타입은 바뀌나요? 다시 검사·출력한 프로그램이 몇 줄을 출력하고 어떤 문장을 만드는지 예상해 보세요.
풀이 확인
greeting은 여전히 string입니다. 출력은 Hello, Explorer! We are embarking on the 2026 TypeScript Journey. 한 줄이며, if (isActive) 본문은 실행하지 않습니다. 타입 검사 통과와 특정 분기의 실행 여부는 다른 질문입니다.
마지막으로 invalidYear의 오류 주석을 해제하고 프로젝트 검사 결과를 확인하세요. noEmitOnError가 새 출력을 막아도 이전 JavaScript는 남을 수 있습니다. 오류 진단을 무시하고 남아 있는 파일의 출력만 확인하지 않습니다.
이 버전별 변경은 공식 TypeScript 6.0 릴리스 노트에 명시되어 있습니다.