본문 바로가기

첫 번째 타입스크립트 프로그램 작성

변수와 함수에 타입을 붙인 첫 파일을 만들고, 편집기에서 추론된 타입과 진단을 확인한 뒤 프로젝트 설정으로 검사하고 컴파일한 자바스크립트를 실행합니다.

앞 글에서 만든 ts-first 프로젝트에 두 번째 파일을 더해, 변수와 함수에 타입을 붙인 작은 프로그램을 만들어 봅니다. 코드를 쓰는 동안 편집기가 보여 주는 정보와, tsc로 검사하고 컴파일하는 과정, 만들어진 자바스크립트를 실행하는 과정을 하나씩 나누어 확인합니다.

아래 그림처럼 이 흐름은 세 단계로 나뉩니다. 소스 파일을 쓰는 단계, 설정에 따라 검사하고 자바스크립트를 내보내는 단계, Node.js가 내보낸 파일을 실행하는 단계입니다. 검사의 성공과 실행의 결과는 서로 다른 질문이므로, 각 단계에서 무엇을 확인하는지 구분해 두면 문제가 생겼을 때 원인을 빨리 찾을 수 있습니다.

첫 프로그램은 네 경계를 따로 확인한다 — 상태 추적

첫 프로그램 작성·진단/방출·JS 실행에서 파일과 결과의 상태가 바뀐다. 같은 소스/출력/실행 역할로 실제 관찰 값을 비교할 수 있다.

first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해2025 welcome/status두 줄을 확인한다.

TYPE / RUNTIME / CONTRACT

첫 프로그램의 검사 · 출력 · 실행을 따로 확인한다

원문 명령은 tsc first-program.ts로 파일을 직접 지정합니다. TypeScript 6.0 이상에서 tsconfig가 있는 폴더라면 TS5112로 중단되므로 본문의 프로젝트 경로를 사용합니다. 프로젝트 정책을 적용하려면 tsc -p .과 noEmitOnError를 사용합니다. 어느 경로를 택하든 생성된 JavaScript의 실행 결과는 별도로 확인합니다.

첫 프로그램의 소스·검사·실행작성→검사와출력정책→실제JavaScript실행3노드2간선이다. TypeScript6설정파일이있는폴더의파일지정명령은TS5112로중단될수있으므로프로젝트경로를구분한다. 고정2025예제의두줄출력과진단을따로확인한다.
.ts 작성명시 · 추론한 타입
연결 관계.ts 작성 · 명시 · 추론한 타입 → 검사 · 출력 정책 · 프로젝트 경로 선택
검사 · 출력 정책프로젝트 경로 선택
연결 관계검사 · 출력 정책 · 프로젝트 경로 선택 → .js 실행 · 두 줄 결과 확인
.js 실행두 줄 결과 확인
첫 프로그램의 소스·검사·실행 · 모바일작성→검사와출력정책→실제JavaScript실행3노드2간선이다. TypeScript6설정파일이있는폴더의파일지정명령은TS5112로중단될수있으므로프로젝트경로를구분한다. 고정2025예제의두줄출력과진단을따로확인한다. 모바일에서도 노드와 연결 방향·독립 경로가 같다.
.ts 작성명시 · 추론한 타입
연결 관계.ts 작성 · 명시 · 추론한 타입 → 검사 · 출력 정책 · 프로젝트 경로 선택
검사 · 출력 정책프로젝트 경로 선택
연결 관계검사 · 출력 정책 · 프로젝트 경로 선택 → .js 실행 · 두 줄 결과 확인
.js 실행두 줄 결과 확인

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 실행에서 파일과 결과의 상태가 바뀐다. 같은 소스/출력/실행 역할로 실제 관찰 값을 비교할 수 있다.

first-program.ts에 문자열과 숫자 계약을 표현하고 검사한다. 5.x의 파일 지정 경로는 설정을 무시하지만, 6.0 이상에서 설정 파일이 있는 폴더는 TS5112로 중단된다. 프로젝트 명령은 설정을 적용한다. 생성된 JavaScript를 Node에서 실행해2025 welcome/status두 줄을 확인한다.

TYPE / RUNTIME / CONTRACT

첫 프로그램의 검사 · 출력 · 실행을 따로 확인한다

원문 명령은 tsc first-program.ts로 파일을 직접 지정합니다. TypeScript 6.0 이상에서 tsconfig가 있는 폴더라면 TS5112로 중단되므로 본문의 프로젝트 경로를 사용합니다. 프로젝트 정책을 적용하려면 tsc -p .과 noEmitOnError를 사용합니다. 어느 경로를 택하든 생성된 JavaScript의 실행 결과는 별도로 확인합니다.

첫 프로그램의 소스·검사·실행작성→검사와출력정책→실제JavaScript실행3노드2간선이다. TypeScript6설정파일이있는폴더의파일지정명령은TS5112로중단될수있으므로프로젝트경로를구분한다. 고정2025예제의두줄출력과진단을따로확인한다.
.ts 작성명시 · 추론한 타입
연결 관계.ts 작성 · 명시 · 추론한 타입 → 검사 · 출력 정책 · 프로젝트 경로 선택
검사 · 출력 정책프로젝트 경로 선택
연결 관계검사 · 출력 정책 · 프로젝트 경로 선택 → .js 실행 · 두 줄 결과 확인
.js 실행두 줄 결과 확인
첫 프로그램의 소스·검사·실행 · 모바일작성→검사와출력정책→실제JavaScript실행3노드2간선이다. TypeScript6설정파일이있는폴더의파일지정명령은TS5112로중단될수있으므로프로젝트경로를구분한다. 고정2025예제의두줄출력과진단을따로확인한다. 모바일에서도 노드와 연결 방향·독립 경로가 같다.
.ts 작성명시 · 추론한 타입
연결 관계.ts 작성 · 명시 · 추론한 타입 → 검사 · 출력 정책 · 프로젝트 경로 선택
검사 · 출력 정책프로젝트 경로 선택
연결 관계검사 · 출력 정책 · 프로젝트 경로 선택 → .js 실행 · 두 줄 결과 확인
.js 실행두 줄 결과 확인

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 실행과 프로그램 실행은 별개이며 실제 파일 경로를 사용한다

변수와 함수에 타입 붙이기

ts-first 폴더에 first-program.ts를 만들고 다음 코드를 씁니다. 타입스크립트 파일은 보통 .ts 확장자를 쓰며, 파일 이름은 자유롭게 정해도 됩니다.

first-program.ts
const appName: string = "TypeScript Journey";
const currentYear: number = 2025;
const isActive: boolean = true;

function createWelcomeMessage(name: string, year: number): string {
  return `Hello, ${name}! We are embarking on the ${year} ${appName}.`;
}

const greeting = createWelcomeMessage("Explorer", currentYear);
console.log(greeting);

if (isActive) {
  console.log(`Current application status: Active for ${currentYear} year.`);
}

변수 이름 뒤에 콜론(:)과 타입을 쓰면 그 변수에 들어갈 값의 종류를 정합니다. appName에는 문자열(string)만, currentYear에는 숫자(number)만, isActive에는 참과 거짓(boolean)만 넣을 수 있습니다. 값을 다시 넣지 않을 변수이므로 let 대신 const로 선언했습니다.

함수에서는 매개변수마다 타입을 쓰고, 괄호 뒤의 : string으로 반환값의 타입을 정합니다. createWelcomeMessage는 문자열 name과 숫자 year를 받아 문자열을 돌려주어야 하므로, 본문에서 실수로 숫자를 돌려주면 컴파일러가 진단합니다. 연도 2025는 예제에 고정한 값이어서, 실행하는 날짜와 관계없이 출력은 같습니다.

편집기에서 확인하기

VS Code에서 greeting에 마우스를 올리면 const greeting: string이 표시됩니다. greeting에는 타입을 쓰지 않았지만, 타입스크립트가 createWelcomeMessage의 반환 타입에서 string을 추론한 것입니다. 모든 곳에 타입을 쓰지 않아도, 추론된 타입으로 같은 검사를 받습니다.

이번에는 파일의 끝에 다음 줄을 15번째 줄로 잠시 추가해 봅니다.

const invalidYear: number = "Two Thousand Twenty-Five";
first-program.ts:15:7 - error TS2322: Type 'string' is not assignable to type 'number'.

편집기는 저장하기 전부터 invalidYear 아래에 빨간 밑줄을 긋고, 문제(Problems) 패널에 같은 내용을 보여 줍니다. 위의 한 줄은 같은 파일을 tsc로 검사했을 때의 진단으로, 파일 이름 뒤의 15:7은 15번째 줄의 7번째 글자인 invalidYear에서 문제가 생겼다는 뜻입니다. 확인했으면 이 줄을 지우고 다음으로 넘어갑니다.

검사하고 실행하기

tsconfig.json의 include는 지금 index.ts만 고르므로, 새 파일도 검사하도록 목록에 더합니다. 나머지 설정은 앞 글과 같습니다.

tsconfig.json
{
  "compilerOptions": {
    "target": "es2022",
    "module": "nodenext",
    "strict": true,
    "noEmitOnError": true,
    "outDir": "dist"
  },
  "include": ["index.ts", "first-program.ts"]
}
tsc -p . --noEmit
tsc -p .
node dist/first-program.js
Hello, Explorer! We are embarking on the 2025 TypeScript Journey.
Current application status: Active for 2025 year.

검사에 오류가 없으면 첫 명령은 아무것도 출력하지 않고, 둘째 명령은 dist 폴더에 index.js와 first-program.js를 만듭니다. 셋째 명령은 first-program.js를 실행해 환영 문장 한 줄과, isActive가 참이어서 실행된 상태 안내 한 줄을 출력합니다. 실행할 파일이 dist 아래에 있다는 점을 놓치면, 다른 위치에 남아 있는 예전 파일을 실행하게 되므로 경로를 정확히 씁니다.

파일 이름을 직접 지정하는 tsc first-program.ts는 이 폴더에서 다르게 동작합니다. TypeScript 5.x는 파일을 지정하면 tsconfig.json을 조용히 무시하고 기본 설정으로 컴파일했지만, 6.0부터는 설정 파일이 있는 폴더에서 이 명령을 오류로 멈춥니다.

tsc first-program.ts
error TS5112: tsconfig.json is present but will not be loaded if files are specified on commandline. Use '--ignoreConfig' to skip this error.

이 진단이 나오면 새 출력은 만들어지지 않습니다. 설정 파일을 무시하는 실험이 꼭 필요할 때만 tsc --ignoreConfig first-program.ts를 쓰며, 이때는 noEmitOnError와 outDir 같은 프로젝트의 설정이 적용되지 않아 출력 파일이 소스 옆에 생깁니다. 이 변경은 공식 TypeScript 6.0 릴리스 노트에 있습니다.

정리

  • 변수와 매개변수 뒤의 : 타입은 들어갈 값의 종류를, 함수 괄호 뒤의 : 타입은 반환값의 종류를 정합니다.
  • 타입을 쓰지 않은 변수도 초기값이나 함수의 반환 타입에서 추론된 타입으로 검사되며, 편집기에서 마우스를 올려 확인할 수 있습니다.
  • tsc의 진단은 파일:줄:글자 - error TS번호: 메시지의 모양으로, 문제가 생긴 위치와 종류를 알려 줍니다.
  • 프로젝트는 tsc -p .으로 검사하고 출력하며, 실행은 outDir에 생긴 파일로 합니다.
  • TypeScript 6.0부터 설정 파일이 있는 폴더에서 파일을 지정해 컴파일하면 TS5112로 멈추고, 설정을 무시하려면 --ignoreConfig를 따로 써야 합니다.

연습 문제

1. 값을 바꾼 프로그램

검사에 성공한 상태에서 currentYear를 2026으로, isActive를 false로 바꾸었습니다. greeting의 추론된 타입은 바뀌나요? 다시 검사하고 출력한 프로그램은 무엇을 출력하나요?

해설 보기

greeting의 타입은 함수의 반환 타입에서 오므로 여전히 string입니다. 출력은 Hello, Explorer! We are embarking on the 2026 TypeScript Journey. 한 줄이며, isActive가 거짓이라 if의 본문은 실행되지 않습니다. 검사를 통과했다는 것과 어느 분기가 실행되는지는 서로 다른 질문입니다.

2. 반환 타입을 쓴 이유

createWelcomeMessage의 본문을 실수로 return year;로 바꾸었습니다. 반환 타입 : string이 있을 때와, 반환 타입을 지웠을 때 진단은 각각 어디에서 나오나요?

해설 보기

반환 타입이 있으면 함수 안의 return year;에서 Type 'number' is not assignable to type 'string'.이라는 TS2322가 나옵니다. 반환 타입을 지우면 함수의 반환 타입이 number로 추론되므로 함수 안에서는 진단이 없고, greeting도 number가 됩니다. 이 프로그램은 greeting을 console.log에만 넘기므로 진단 없이 통과해 연도만 출력하게 되며, 반환 타입을 적어 두면 이런 실수를 함수가 정의된 곳에서 바로 잡을 수 있습니다.

3. 파일을 지정한 컴파일

ts-first 폴더에서 tsc first-program.ts를 실행했더니 TS5112가 나왔습니다. 프로젝트의 설정을 적용해 컴파일하려면 어떤 명령을 써야 하나요? tsc --ignoreConfig first-program.ts로 실행하면 무엇이 달라지나요?

해설 보기

프로젝트의 설정을 적용하려면 파일 이름 없이 tsc -p .을 씁니다. tsc --ignoreConfig first-program.ts는 tsconfig.json을 읽지 않고 컴파일러의 기본 설정으로 그 파일만 컴파일하므로, noEmitOnError가 적용되지 않아 오류가 있어도 출력할 수 있고, 출력 파일은 dist가 아닌 소스 옆에 first-program.js로 생깁니다. 두 방법을 섞어 tsc -p . first-program.ts처럼 쓰지 않습니다.

다음 장의 기본 타입에서는 이 글에서 쓴 string, number, boolean을 포함해 타입스크립트의 기본 타입을 하나씩 살펴봅니다.