[TS] ํ์ ์คํฌ๋ฆฝํธ ์ค์น๋ถํฐ ๋ฐ์ดํฐ ํ์ ๋ช ์๊น์ง

๐ฑ ํ์ ์คํฌ๋ฆฝํธ ๋ ธํธ ๊นํ
๋ ธํธ: src - index.ts
ํ์ด๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ฉด์, ์ ๋ฌ๋ฆฌ ์๋ฌ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค. ๋ฐ๋ก ์๋ฒ์์ ๊ฐ์ ธ์จ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก To-do list๋ฅผ ๋ ๋๋งํด์ผํ ๋ ์๊พธ ์ฐ๋ฆฌ ์ ๊ฐ not a function ์ด๋ผ๋๊ฐ cannot get 0 of undefined๋ผ๋๊ฐ ์๋ฌ๊ฐ ๋จ๋ ๊ฒ์ด๋ค. ๋ถ๋ช ํ ์ฝ๋ ์์ผ๋ก ๋ณด์์ ๋ ์ฐ๋ฆฌ ์ ๋ not a function์ผ๋ฆฌ๊ฐ ์๊ณ undefined ์ผ๋ฆฌ๊ฐ ์๋๋ฐ ๋๋์ฒด ์ ์ด๋ฌ๋ ์ถ์๋๋ฐ... ๋๋ฅ
๋ฌธ์ ์ ์์ธ์ ์๋ฒ์์ ๋ฐ๋ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ ํ์ ๊ณผ ํด๋ผ์ด์ธํธ ์ชฝ์์ ์์ฑํ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ ํ์ ์ด ์๋ก ๋ฌ๋ผ์, ๋ด๊ฐ ์ฐพ๋ ํ๋กํผํฐ๊ฐ ์๋ค๊ฑฐ๋ ์ธ๋ฑ์ค๊ฐ ์๋ค๊ฑฐ๋ ํ๋ ์ผ์ด ๊ณ์ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ํ์ด๋ ํ๋ก์ ํธ ์ด์ ์ ํ๋ ์์ ํ ์ด ํ๋ก์ ํธ๋ค์ ์๋ฌด๋๋ ๊ท๋ชจ๋ ์๊ณ ๋ฐ์์ค๋ ๋ฐ์ดํฐ๋ ํ์ ์ ์ด์ฌ์ ์ด์ ๊ฐ์ ์ด์๊ฐ ๋ฐ์ํ๋ ์ ์ด ์์๋ค. ๋ฐฑ์๋ ๋ด๋น ํ์๊ณผ ํจ๊ป ํ ์คํ ์ ํด๊ฐ๋ฉฐ ์๋ฌ๋ ๊ธ๋ฐฉ ์ก์์ง๋ง, ์ด๋ ๋ฐ์ดํฐ ํ์ ์ง์ ์ ํ์์ฑ์ ์ฒ์์ผ๋ก ๋๊ผ๊ณ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ผญ ๋ฐฐ์์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ๊ทธ๋์ ์ฝ๋์คํ ์ด์ธ ์๋ฃ๋ฅผ ํ์ง ๋ฑ ์ผ์ฃผ์ผ์ด ๋๋ ์ด ์์ , ์๋กญ๊ฒ ์์ํ ํ์ ์คํฌ๋ฆฝํธ ๊ณต๋ถ๋ฅผ ๋ณต์ตํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ค์น๋ถํฐ ๊ธฐ๋กํ ๋ด์ฉ์ ๊ณต์ ํ๊ณ ์ ํ๋ค.
1. ๊ธฐ๋ณธ ์ธํ
ํ์ ์คํฌ๋ฆฝํธ ์ค์น
npm install -g typescript
์ค์น๊ฐ ์ ๋๋ก ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฒ์ ์ฒดํฌ ํ๋ฒ!
tsc --v
ํ์ผ๋ช : .ts
ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ .ts๋ก ๋ง๋ค์ด์ค๋ค.
์: app.ts
์ปดํ์ผํ๊ธฐ
ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ superset์๊ณผ ๋์์, ์ปดํ์ผ๋ฌ์ด๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ts ํ์ผ๋ก ์์ฑํ ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ์ปดํ์ผ์ ํด์ฃผ์ด์ผ ํ๋ค.
tsc app.ts
๋ช ๋ น์ด tsc๋ ๋ง๊ทธ๋๋ก TypeScript Compile์ด๋ค. ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด, ๋๋ ํ ๋ฆฌ์ app.ts๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผํ app.js ํ์ผ์ด ์์ฑ๋๋ค.
๊ทธ๋ฐ๋ฐ, ๊ทธ๋ฅ ์ด๋ ๊ฒ tsc ์ปดํ์ผ๋ง ํ๋ฉด app.ts ํ์ผ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ ์ ๋ฐ์ดํธ ์ฌํญ์ด ์๊ฒผ์ ๋ ์๋์ผ๋ก app.js์ ๋ฐ์์ด ๋์ง ์๋๋ค. ๊ทธ๊ฑธ ํด์ฃผ๊ธฐ ์ํด์ ๋ช ๋ น์ด์ -w๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค. -w๋ฅผ ์ถ๊ฐํ๋ฉด watch mode์ ๋ค์ด๊ฐ๊ฒ ๋๊ณ , ํ์ผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ฒผ์ ๋ (=์ฝ๋ ๋ฐ๊พธ๊ณ ์ ์ฅํ์ ๋) ์๋์ผ๋ก ๊ทธ๊ฑธ ๊ฐ์งํด์ app.js์ ๋ฐ์์์ผ์ค๋ค.
tsc -w app.ts
ํฐ๋ฏธ๋์ ์์ฑํ๋ฉด, ์๋์ ๊ฐ์ด watch mode์์ ์ปดํ์ผ๋ง์ ์์ํ๋ค๋ ์๋ด๋ฌธ๊ตฌ๊ฐ ๋์จ๋ค.


tsconfig.json
tsc ์ฝ๋งจ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ์ปดํ์ผํ๋ฉด, ๋ณ์ ์ ์ธ์ ํ ๋ var ํค์๋๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ์ปดํ์ผ๋ง ์ค์ ์ด let๊ณผ const๊ฐ ๋์ ๋๊ธฐ ์ด์ ์ธ es5๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ๊ณ ์ณ์ฃผ๊ธฐ ์ํด์ tsconfig.json ํ์ผ์์ ์์ ์ ํด์ฃผ์ด์ผ ํ๋ค.
tsc --init
ํฐ๋ฏธ๋์ tsc --init๋ฅผ ์ ๋ ฅํ๋ฉด ๊ธฐ๋ณธ tsconfig.json ํ์ผ์ด ์์ฑ๋๋ค. ์ฌ๊ธฐ์ compilerOptions์ target์ ๊ธฐ์กด์ "es5"์์ "es6"๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ tsc ์ฝ๋งจ๋๋ฅผ ๋ค์ ๋๋ฆฌ๋ฉด, ๊ธฐ์กด์ ๋ชจ๋ ts ์ปดํ์ผ๋ง ๊ฒฐ๊ณผ๋ฌผ๋ค์ด es6๋ก ์ ๊ทธ๋ ์ด๋๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
2. ํ์ ์คํฌ๋ฆฝํธ: ๋ฐ์ดํฐ ํ์ ์ ์ ์ํ์!
ํ์ ์คํฌ๋ฆฝํธ๋ ์ ์ ํ์ ํ (Static typing)์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ๊ณตํ๋ค. ์ ์ ํ์ดํ์ด๋, ๋ฐ์ดํฐ ํ์ ์ ํน์ ํ๊ณ , ๊ทธ ํน์ ๋ ํ์ ๋ง์ด ํ ๋น ๋๋ ๋ฐํ๋์ด์ผ ํ๋ค๋ ๊ท์น์ ๋ปํ๋ค.์ด๋ฅผ ์ํด ํ์ ์คํฌ๋ฆฝํธ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ๋ฐ๋ก ํ์ ๋ช ์(type annotations)์ ํ์ ์ถ๋ก (type inference)์ด๋ค.
(1) ํ์ ๋ช ์ (Type annotations)
๋ณ์๋ฅผ ์ ์ธํ ๋ ๋ณ์ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋ฏธ๋ฆฌ ์ง์ ํด์ฃผ๋ ๊ฒ์ ๋ปํ๋ค. ๋ณ์๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ค. ๋ณ์๋ช ๋ค์ : ์ ๋ถ์ด๊ณ , ๊ทธ ๋ค์์ ๋ฐ์ดํฐ ํ์ ์ ๋ช ์ํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ฐ์ดํฐ ํ ๋น์ ์ํด =๊ณผ ์ฃผ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
const IamString: string = "Hello from the other side"
const IamNumber: number = 123456789
const IamBoolean: boolean = true
ํจ์์ ์ธ์์ ๋ฆฌํด๊ฐ์๋ ํ์ ์ ๋ช ์ํ ์ ์๋ค.
// doSomething ํจ์๋ ์ธ์๋ก ๋ฐ์ดํฐ ํ์
์ด ์คํธ๋ง์ธ action ์ธ์๋ฅผ ๋ฐ๋๋ค
function doSomething (action: string) {
// something going on
}
// ๋ฆฌํด๊ฐ์ ํ์
๋ช
์ํ๊ธฐ
function doSomething (action: string): string {
// something going on
...
return 'Done!'
}
// ๋ง์ฝ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์๋ ํจ์์ผ ๊ฒฝ์ฐ์ void๋ผ๊ณ ์์ฑํ๋ค!
function doSomething (action: string): void {
// something going on
...
...
// ๋ฆฌํด ์
์
}
๊ฐ์ฒด์๋ ํ์ ์ ์ง์ ํด์ค ์ ์๋ค. ๊ฐ์ฒด๋ ๊ทธ ์์ ํ๋กํผํฐ & ๋ฉ์๋ ๊ตฌ์กฐ์ ๋ฐ๋ผ ํ์ ์ ์ง์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
//ํจ์ ๋ฆฌํด๊ฐ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ
function createCharacter (name: string, job: string): {
id: number;
name: string;
job: string;
level: number;
noob: boolean;
walk: (position: number) => void;
chat: (message: string) => string;
} {
...
return {...}
}
// ํจ์ ์ธ์๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ
function sayHello(person: { name: string; age: number }) {
return `Hello ${person.name}`
}
๊ทธ๋ฐ๋ฐ, ์์ ๊ฐ์ด ํจ์์ ๋ฆฌํด๊ฐ์ธ ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋ช ์๋ฅผ ํด์ฃผ๋ฉด, ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค. ์ด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก interface์ด๋ค. interface๋ฅผ ๋ง๋ค์ด์ ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ interface๋ ๋ง์น ๋ฐ์ดํฐ ํ์ ์ ํ ์ข ๋ฅ์ฒ๋ผ ์ทจ๊ธ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ํด๋น ํจ์์ ๋ฆฌํด๊ฐ์ด ์ง์ ๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ด๋ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
// ์์ 1: ํจ์ ๋ฆฌํด๊ฐ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ
interface Character {
id: number;
name: string;
job: string;
level: number;
noob: boolean;
walk: (position: number) => void;
chat: (message: string) => string;
}
function createCharacter (name: string, job: string): Character {
...
return {...}
}
// ์์ 2 :ํจ์ ์ธ์๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ
interface Person {
name: string;
age: number;
}
function sayHello(person: Person) {
return `Hello ${person.name}`
}
๋ํ, ๋ง์ฝ์ ๋ฐํ๋๋ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ์ง์ ๋ ํ๋กํผํฐ๋ค ์ค์์ ๋ฆฌํด๊ฐ์ ํฌํจ๋์ง ์์ ๊ฒ์ด ์๋ค๋ฉด, ๊ทธ ๋๋ฝ๋ ํ๋กํผํฐ๊ฐ ๋ฌด์์ธ์ง ์๋ฌ ๋ฉ์์ง๊ฐ ์น์ ํ ์๋ ค์ค๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ, ๋ฆฌํด๊ฐ์์ ํน์ ํ๋กํผํฐ ํ๋๋ง ๋นผ๊ณ ๋์ค๋๊ฒ ์๋ํ ๊ฒ์ด์๋ค๋ฉด?! ๊ทธ๋ด๋ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ๋ ํด๋น ํ๋กํผํฐ์ key ์์ ?๋ฅผ ์ดํฌ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. ?๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํด๋น ํ๋กํผํฐ๋ Optionalํ ํ๋กํผํฐ๋ก ๋ณ๊ฒฝ๋๋ฉฐ, ๋ฆฌํด๊ฐ์ด ํด๋น ์ธํผํ์ด์ค๋ก ์ง์ ๋ ํจ์์ ๋ฆฌํด๊ฐ์ ๊ทธ ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋์ด ์์ง ์๋๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
interface SurveyAnswers {
personalInfo: boolean;
marketingContact?: boolean;
}
< ํ์ ์คํฌ๋ฆฝํธ์ ์ฌ๋ฌ๊ฐ์ง Utility Types >
๋งํฌ: https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype
(2) ํ์ ์ถ๋ก (Type inference)
ํ์ ์ถ๋ก ์ด๋, ๋ณ์๋ฅผ ๋ง๋ค ๋ ํด๋น ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ด ๋ช ์๋์ด ์์ง ์์ ๊ฒฝ์ฐ, ์ฒ์ ํ ๋น๋ ๊ฐ์ ํ์ ์ ํด๋น ๋ณ์๊ฐ ๊ฐ์ ธ์ผํ ํ์ ์ผ๋ก ์ถ๋ก ํ์ฌ ์ง์ ํ๋ ๊ธฐ๋ฅ์ ๋ปํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ let number = 777๋ก number๋ผ๋ ๋ณ์์ ์ซ์ 777์ ํ ๋นํ๋ค๋ฉด, ๋ค์ ์ด number๋ผ๋ ๋ณ์์ ๋๋ฒ ํ์ ์ด ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ํ ๋น๋ ์ ์๋ค. ํ์ ์ถ๋ก ์ ๊ฐ์ฒด์ ํจ์์๋ ๋ชจ๋ ์ ์ฉ๋๋ค.
// ๋ณ์ํ์
์ง์ ์์ด ์ ์ธ&ํ ๋น๋ number.
let number = 772
// ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์๋ ์ฝ๋๊ฐ ๊ฐ๋ฅํ๋ค.
// ํ์ง๋ง ํ์
์คํฌ๋ฆฝํธ์์ ์๋ฌ๊ฐ ๋๋ค.
number = '์น ์น ์ด'
// ์๋์ ๊ฐ์ด ๊ฐ์ ๋๋ฒ ๋ฐ์ดํฐ ํ์
์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค
number = 773
