npm install -g typescript
# 단일 파일 컴파일
tsc app.ts
# 실시간 컴파일 (변경사항 감지)
tsc -w app.ts
프로젝트 루트에 tsconfig.json 파일을 생성하고 TypeScript 컴파일 옵션을 설정합니다.
{
"compilerOptions": {
"target": "es5",
"module": "commonjs"
}
}
es5, es2015, es2016, esnext)commonjs, es2015, esnext)commonjs: require() 문법 사용es2015: import/export 문법 사용{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"noImplicitAny": true,
"strictNullChecks": true
}
}
{
"compilerOptions": {
// 기본 설정
"target": "es5",
"module": "commonjs",
// 파일 처리
"allowJs": true, // JS 파일 import 허용
"checkJs": true, // JS 파일 에러 체크
"jsx": "preserve", // JSX 컴파일 방식
"declaration": true, // .d.ts 파일 자동 생성
// 출력 설정
"outFile": "./", // 모든 파일을 하나로 컴파일
"outDir": "./dist", // 출력 디렉토리
"rootDir": "./src", // 루트 디렉토리
"removeComments": true, // 주석 제거
// 엄격한 타입 체크
"strict": true, // 모든 strict 옵션 활성화
"noImplicitAny": true, // any 타입 금지
"strictNullChecks": true, // null/undefined 엄격 체크
"strictFunctionTypes": true, // 함수 파라미터 엄격 체크
"noImplicitThis": true, // this 타입 체크
// 추가 체크
"noUnusedLocals": true, // 사용하지 않는 지역변수 에러
"noUnusedParameters": true, // 사용하지 않는 파라미터 에러
"noImplicitReturns": true, // return 누락 에러
"noFallthroughCasesInSwitch": true // switch문 fallthrough 에러
}
}
let 이름: string = 'kim'
let 나이: number = 20
let 결혼했니: boolean = false
중요:
string, number, boolean)String, Number는 객체 타입으로 다름// 자동으로 타입이 추론됨 (권장 방식)
let 이름 = 'kim' // string 타입
let 나이 = 20 // number 타입
let 결혼했니 = false // boolean 타입
let 회원들: string[] = ['kim', 'park']
let 숫자들: number[] = [1, 2, 3]
let 내정보: { age: number } = { age: 20 }
// 복잡한 객체
let 유저정보: {
name: string,
age: number,
married: boolean
} = {
name: 'kim',
age: 25,
married: false
}
let 이름: string | number = 'kim'
이름 = 123 // 가능
let 나이: string | number = 100
// Array에 여러 타입
let 어레이: (number | string)[] = [1, '2', 3]
// Object 속성에 여러 타입
let 오브젝트: { data: number | string } = { data: 123 }
let 상태: 'loading' | 'success' | 'error' = 'loading'
let ID: string | number = 'user123'
let 이름: any = 'kim'
이름 = 123
이름 = []
이름 = {} // 모든 타입 허용, 타입 체크 해제
any의 문제점:
let 변수: unknown = 'kim'
변수 = 123
변수 = [] // 모든 타입 할당 가능
// 하지만 사용 시 제한
let str: string = 변수 // 에러!
변수.toUpperCase() // 에러!
변수 + 1 // 에러!
unknown의 특징:
function 내함수(x: number): number {
return x * 2
}
// 화살표 함수
let 함수 = (x: number): number => {
return x * 2
}
function 출력함수(x: string): void {
console.log(x)
// return이 없거나 return만 있는 함수
}
function 인사(name?: string): void {
if (name) {
console.log(`안녕하세요 ${name}`)
} else {
console.log('이름이 없습니다')
}
}
인사() // 가능
인사('홍길동') // 가능
주의: name?는 name: string | undefined와 동일
function 계산(x: number | string) {
return x + 1 // 에러! Union 타입은 공통 속성만 사용 가능
}
해결 방법: 타입 가드 사용 (추후 학습)
let user: string = 'kim'
let age: number | undefined = undefined
let married: boolean = false
let 철수: (string | number | boolean | undefined)[] = [user, age, married]
let 학교: {
score: (number | boolean)[],
teacher: string,
friend: string | string[]
} = {
score: [100, 97, 84],
teacher: 'Phil',
friend: 'John'
}
학교.score[4] = false
학교.friend = ['Lee', 학교.teacher]
// 인사 함수
function 인사하기(name?: string): void {
if (name) {
console.log(`안녕하세요 ${name}`)
} else {
console.log('이름이 없습니다')
}
}
// 자릿수 세기 함수
function 자릿수세기(x: number | string): number {
return x.toString().length
}
// 결혼 가능성 판별 함수
function 결혼가능하냐(
money: number,
house: boolean,
charm: string
): string | void {
let score: number = 0
score += money
if (house === true) {
score += 500
}
if (charm === '상') {
score += 100
}
if (score >= 600) {
return '결혼가능'
}
}
let 나이: string | number
나이 + 1 // 에러!
원인: Union 타입에서는 공통 연산만 가능
let 변수: unknown = 1
변수 + 1 // 에러!
원인: unknown 타입은 사용 전 타입 확인 필요
function 계산(x?: number): number {
return x * 2 // 에러! x는 undefined일 수 있음
}
원인: 선택적 파라미터는 undefined 가능성 있음
tsc -w 출력# 1. TypeScript 파일 작성
# 2. 실시간 컴파일 실행
tsc -w
# 3. JavaScript 파일 실행
node app.js
tsc -w)