interface Foo {
prop: string
}
type Bar = { prop: string }
๊ฐ์ฒด์ ์ฌ์ฉํ๋ type๊ณผ interface๋ ๋งค์ฐ ์ ์ฌํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋ค.
๊ทธ๋ฌ๋ ํ์ ๊ฐ ๊ฒฐํฉ์ด ํ์ํ ๋๋, interface๋ฅผ ํ์ฅํ๋ ๊ฒ์ด ์ฑ๋ฅ์์ผ๋ก ์ ๋ฆฌํ๋ค.
interface๋ ๋จ์ํ ๊ฐ์ฒด์ ๋ํ ๋ชจ์์ ํํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ๊ฐ๊ฐ ์ฌ ๊ฒฝ์ฐ ๋จ์ํ ํฉ์ณ๋ฒ๋ฆฌ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ type์ ๊ฐ์ฒด ๋ฟ ๋ง ์๋๋ผ ๋จ์ํ ์์ํ์ ๋ ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณํฉํ ๋ ๊ฐ์ฒด์ ์์ฑ๋ค๊น์ง ํ๋ํ๋ ํฉ์ณ์ผ ํ๋ค.(์ฌ๊ท์ ์ธ ํ์ ๋จธ์ง) ํนํ, ๊ฐ์ฒด ์์ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ ๋, ๊ทธ ๋ด๋ถ ์์ฑ๊น์ง ๋ค ํฉ์ณ์ผํด์ ๋๋๋ก never์ ๋ฐํํ๊ธฐ๋ ํ๋ค.
type A = { a: string }; // A์ 'a' ์์ฑ์ string ํ์
.
type B = { a: number }; // B์ 'a' ์์ฑ์ number ํ์
.
์๋ก ๋ค๋ฅธ ํ์ ์ ๋ณํฉํ ๋ ํ์ ์ด ์ถฉ๋ํ๋ฉด never ํ์ ์ด ์ค๊ฒ ๋๋ค.
-> ๋ฐ๋ผ์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด ํ์ ์ ํฉ์ฑํด์ผ ํ๋ค๋ฉด, interface์ extends๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ง์ ๋ฆฌํดํ์ ์ ์ง์ ํด์ค๋ค๋ฉด ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ํจ์์ ํ์ ์ ์ถ๋ก ํ๋ ๊ฒ ๋ณด๋ค ํจ์ฌ๋ ์ฑ๋ฅ์ ์ผ๋ก ์ด์ ์ ์ป์ ์ ์๋ค.
declaration ํ์ผ์ ์ฝ๊ณ ์ฐ๋๋ฐ ๋ง์ ์๊ฐ์ ์ ์ฝํด์ค๋ค. (incremental builds) ๋ฌผ๋ก ํ์ ์ถ๋ก ์ ๋งค์ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์, ๋ค ์ด๊ฑธ ์ฒ๋ฆฌํ ํ์๋ ์์ง๋ง, ์ฝ๋์์ ์ฝ๊ฐ์ ๋ณ๋ชฉํ์์ด ์๊ธด๋ค๋ฉด ๊ณ ๋ คํด๋ณผ๋ง ํ๋ค.
let name: string = "Alice"; // name ๋ณ์๋ string ํ์
์ด์ด์ผ ํ๋ค๊ณ ๋ช
์
let age: number = 25; // age ๋ณ์๋ number ํ์
์ด์ด์ผ ํ๋ค๊ณ ๋ช
์
ํจ์์ ํ์ ์ด๋ ธํ ์ด์
function greet(name: string): string {
// greet์ ๋งค๊ฐ๋ณ์ name์ด string ํ์
์ด์ด์ผ ํ๊ณ , ๋ฐํ ๊ฐ๋ string ํ์
๋ช
์
return `Hello, ${name}`;
}
-> ๋ฆฌํดํ์ ์ ์ง์
ํ์ union์ ๊ฐ์ ๋ํ ๋ค์ํ ํ์ ์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ์ง๋ง, ๋น์ฉ์ด ๋ฐ์ํ๋ค.
interface WeekdaySchedule {
day: 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday'
wake: Time
startWork: Time
endWork: Time
sleep: Time
}
interface WeekendSchedule {
day: 'Saturday' | 'Sunday'
wake: Time
familyMeal: Time
sleep: Time
}
declare function printSchedule(schedule: WeekdaySchedule | WeekendSchedule)
printSchedule์ ์ธ์๊ฐ ๋์ด๊ฐ ๋๋ง๋ค, ๊ฐ ์ธ์๋ค์ union์ ์๋ ํ์ ๋ค๊ณผ ๋์กฐํ๊ธฐ ์์ํ๋ค. ๋ฌผ๋ก ๋จ์ํ ํ์ ์ด ๋๊ฐ ๋ฟ์ด๋ผ๋ฉด (์ฑ๋ฅ์ ์ธ ์ฐจ์ด๋) ๋ฌด์ํ ๋งํ๋ค. ๊ทธ๋ฌ๋ ์ด ์ซ์๊ฐ ๋ง์์ง๋ค๋ฉด, ์ปดํ์ผ ์๋์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด, union์์ ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ์ํด ๊ฐ๊ฐ์ ์์๋ฅผ ์์ผ๋ก ๋น๊ตํด์ผ ํ๋ฉฐ, ์ด๋ 2์ฐจ์ ์ผ๋ก ๋๋ ๋น์ฉ์ด๋ค. ์ด๋ฌํ ์ข ๋ฅ์ ๊ฒ์ฌ๋ union์ด ์ปค์ง ์๋ก ๋์ฑ ๋ง์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด ๊ท๋ชจ๋ฅผ ์ค์ฌ์ผ ํ๋ค. ์ด๋ฅผ ์ํด union ๋ณด๋ค๋ ํ์ ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
interface Schedule {
day:
| 'Monday'
| 'Tuesday'
| 'Wednesday'
| 'Thursday'
| 'Friday'
| 'Saturday'
| 'Sunday'
wake: Time
sleep: Time
}
interface WeekdaySchedule extends Schedule {
day: 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday'
startWork: Time
endWork: Time
}
interface WeekendSchedule extends Schedule {
day: 'Saturday' | 'Sunday'
familyMeal: Time
}
declare function printSchedule(schedule: Schedule)
-> ๊ณตํต์ ์ธ ๋ถ๋ชจ ํ์ ์ ๋ง๋ค์ด์ ์์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ๋ฅผ ๋จ์ํ ํ์! ์ด๋ ๊ฒ ํ๋ฉด TypeScript๊ฐ ์ ๋์จ์์ ๋งค๋ฒ ํ์ ์ ๋น๊ตํ๋ ์ผ์ ์ค์ผ ์ ์์ด ์ฑ๋ฅ์ด ๊ฐ์ ๋ ์ ์๋ค.
ํ๋ก์ ํธ์ ํฌ๊ธฐ์ ๊ตฌ์กฐ๋ ์ ์ ํ ์์ค์์ ๊ท ํ์ ์ก์์ผ ํ๋ค. ํ๋ก์ ํธ๊ฐ ๋๋ฌด ํฌ๋ฉด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๊ณ , ๋๋ฌด ์์ผ๋ฉด ํจ์จ์ฑ์ด ๋จ์ด์ ธ์ ์คํ๋ ค ๋ถํ์ํ ์์ ์ด ๋ง์์ง ์ ์๋ค. ๊ด๋ จ๋ ํ์ผ๋ผ๋ฆฌ ๋ฌถ๊ณ , ์ ์ ํ ๋จ์๋ก ํ๋ก์ ํธ๋ฅผ ๋๋๋ ๊ฒ์ด ์ด์์ ์ด๋ค.
ํ๋ก์ ํธ์์ JavaScript ํ์ผ๊ณผ TypeScript ํ์ผ์ ํด๋๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
๊ธฐ๋ฅ์ด ๋น์ทํ๊ฑฐ๋ ๊ด๋ จ๋ ์ฝ๋๋ค์ ๊ฐ์ ํด๋ ์์ ๋ฌถ๋ ๊ฒ ์ข๋ค. ๊ด๋ จ์ด ์๋ ์ฝ๋๊ฐ ์์ฌ ์์ผ๋ฉด ๋์ค์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
๋๋ฌด ํฐ ํ๋ก์ ํธ
ํ๋์ ํ๋ก์ ํธ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ ํธ๋ณด๋ค ํจ์ฌ ํฌ๋ฉด, ์ด๋ ํ๋ก์ ํธ์ ๋ณต์ก๋๊ฐ ๋๋ฌด ๋์์ก๋ค๋ ๊ฒฝ๊ณ ์ ํธ๋ก ๋ณผ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํ๋ก์ ํธ๋ฅผ ๋ ์์ ๋จ์๋ก ๋๋๋ ๊ฒ์ด ์ข๋ค.
๋๋ฌด ์์ ํ๋ก์ ํธ
ํ๋ ๊ฐ์ ํ์ผ๋ง์ ๊ฐ์ง๊ณ ์์ญ ๊ฐ์ ํ๋ก์ ํธ๋ก ์ชผ๊ฐ๋ฉด, ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ์๊ฒจ์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ค. ๋นํจ์จ์
ํ๋ก์ ํธ์ ํฌ๊ธฐ๋ ์ ์ ํด์ผํ๋ค. ๋๋ฌด ํฌ์ง๋, ๋๋ฌด ์์ง๋ ์๊ฒ ์ ์ ํ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ฑด ๋ง์น "ํจ์๋ ํด๋์ค๊ฐ ๋๋ฌด ํฌ๋ฉด ๊ด๋ฆฌํ๊ธฐ ํ๋ค๊ณ , ๋๋ฌด ์์ผ๋ฉด ๋ถํ์ํ๊ฒ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋๋ค"๋ ๊ฒ๊ณผ ๋น์ทํ ์๋ฆฌ์ด๋ค.
ํญ์ ์ค์ ํ์ผ์ด ํ๋ฒ์ ๋๋ฌด ๋ง์ ํ์ผ์ ํฌํจํ์ง ์๋๋ก ์กฐ์ฌํด์ผ ํ๋ค.
tsconfig.json์ ์ฌ์ฉํ๋ค๋ฉด, ํ๋ก์ ํธ์ ํ์ผ์ ํน์ ํ๋ ๋ฐฉ๋ฒ์ด ๋๊ฐ์ง๊ฐ ์๋ค.
files
include exclude
files๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ง์ ํ๋ ๋ฐฉ์
์ฅ์ : ํ์ผ์ ๋น ๋ฅด๊ฒ ๋ก๋ํ ์ ์์.
๋จ์ : ํ๋ก์ ํธ ํ์ผ์ด ๋ง์์ง๋ฉด ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค. ์๋ก์ด ํ์ผ์ ์ถ๊ฐํ ๋๋ง๋ค ์ค์ ํ์ผ(tsconfig.json)์ ์ผ์ผ์ด ์ถ๊ฐํด์ผ ํ ์๋ ์๋ค.
include/exclude๋ ๊ธ๋ก๋น ํจํด์ ์ฌ์ฉํด ํน์ ํด๋๋ ํ์ผ์ ํฌํจํ๊ฑฐ๋ ์ ์ธํ๋ ๋ฐฉ์์ด๋ค.
์ฅ์ : ํ์ผ์ ์ผ์ผ์ด ์ง์ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ๋์ด์ค๋ค.
๋จ์ : TypeScript๊ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์, ํด๋๊ฐ ๋ง์ผ๋ฉด ์ปดํ์ผ ์๋๊ฐ ๋๋ ค์ง ์ ์๋ค. ํ์ ์๋ .d.ts๋ ํ
์คํธ ํ์ผ์ด ํฌํจ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ปดํ์ผ ์๋์ ์ํฅ์ ์ค ์ ์๋ค.
exclude๋ ๊ธฐ๋ณธ์ ์ผ๋ก node_modules ๊ฐ์ ๋๊ท๋ชจ ํด๋๋ฅผ ์ ์ธํ์ง๋ง, ์ด๋ฅผ ์ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๋ฌด๊ฑฐ์ด ํด๋๊ฐ ํฌํจ๋ ์ ์๋ค.
์ด ๋ด์ฉ์ TypeScript์ tsconfig.json ์ค์ ํ์ผ์์ files์ include/exclude ์ต์ ์ ์ด๋ป๊ฒ ์ค์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ์ฅ๋จ์ ๊ณผ ์ต์ ์ ์ค์ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ณ ์์ด์. ์ด๋ฅผ ์ฝ๊ฒ ์์ฝํด๋ณผ๊ฒ์:
์์ฝ:
files๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ง์ ํ๋ ๋ฐฉ์์ด์ผ.
์ฅ์ : ํ์ผ์ ๋น ๋ฅด๊ฒ ๋ก๋ํ ์ ์์.
๋จ์ : ํ๋ก์ ํธ ํ์ผ์ด ๋ง์์ง๋ฉด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์. ์๋ก์ด ํ์ผ์ ์ถ๊ฐํ ๋๋ง๋ค ์ค์ ํ์ผ(tsconfig.json)์ ์ผ์ผ์ด ์ถ๊ฐํด์ผ ํ ์๋ ์์.
include/exclude๋ ๊ธ๋ก๋น ํจํด์ ์ฌ์ฉํด ํน์ ํด๋๋ ํ์ผ์ ํฌํจํ๊ฑฐ๋ ์ ์ธํ๋ ๋ฐฉ์์ด์ผ.
์ฅ์ : ํ์ผ์ ์ผ์ผ์ด ์ง์ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ๋์ด์ค.
๋จ์ : TypeScript๊ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์, ํด๋๊ฐ ๋ง์ผ๋ฉด ์ปดํ์ผ ์๋๊ฐ ๋๋ ค์ง ์ ์์. ํ์ ์๋ .d.ts๋ ํ
์คํธ ํ์ผ์ด ํฌํจ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ปดํ์ผ ์๋์ ์ํฅ์ ์ค ์ ์์.
exclude๋ ๊ธฐ๋ณธ์ ์ผ๋ก node_modules ๊ฐ์ ๋๊ท๋ชจ ํด๋๋ฅผ ์ ์ธํ์ง๋ง, ์ด๋ฅผ ์ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๋ฌด๊ฑฐ์ด ํด๋๊ฐ ํฌํจ๋ ์ ์์.
์ต์ ์ ์ค์ ๋ฐฉ๋ฒ
1. ํ๋ก์ ํธ์ ์์ค ํ์ผ์ด ์๋ ํด๋๋ง ๋ช
์ํ๋ค. (์: src ํด๋)
2. ๋ค๋ฅธ ํ๋ก์ ํธ์ ์์ค ํ์ผ๊ณผ ์์ด์ง ์๊ฒ ํด๋๋ฅผ ์ ๊ตฌ๋ถํ๋ค.
3. ํ
์คํธ ํ์ผ์ ์๋ณธ ํ์ผ๊ณผ ๊ฐ์ ํด๋์ ๋๋, ์ฝ๊ฒ ์ ์ธํ ์ ์๋๋ก ๊ณ ์ ํ ์ด๋ฆ ํจํด(์: *.test.ts)์ ์ฌ์ฉํ๋ค.
node_modules๋ ๋๊ท๋ชจ ๋น๋ ํ์ผ๋ค์ ์์ค ๋๋ ํ ๋ฆฌ์ ํฌํจ์ํค์ง ๋ง์.
{
"compilerOptions": {
// ...
},
"include": ["src"],
"exclude": ["**/node_modules", "**/.*/"]
}
์ต์์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ํด ํด๋๋ฅผ ์ ์ ๋ฆฌํ๊ณ , ๋ถํ์ํ ํ์ผ์ ์ ์ธํ๋ ์ค์ ์ ์ ํด๋๋ ๊ฒ์ด ์ค์ํ๋ค.
TypeScript๋ node_modules ํด๋์ ์๋ @types ํจํค์ง๋ฅผ ์๋์ผ๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ค. ๊ฐ๋ฐ์๊ฐ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก importํ์ง ์์๋, ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์ ์๊ฐ ํ๋ก์ ํธ์ ์๋์ผ๋ก ๋ก๋๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด, node_modules ํด๋์ @types/node, @types/jasmine, @types/mocha ๊ฐ์ ํ์
์ ์ ํจํค์ง๊ฐ ์์ ๋, TypeScript๋ ์ด๋ฅผ ์๋์ผ๋ก ํฌํจํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด, ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(jasmine์ด๋ mocha ๊ฐ์ ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ํ์
๋ ์๋์ผ๋ก ๋ก๋๋ ์ ์๋ค.
๐ค ์ฌ๊ธฐ์ ๋ฌธ์ ์ ?
ํ์ผ ์๋ ์ ํ -> ์ปดํ์ผ ์๊ฐ์ด๋ ์ฝ๋ ํธ์ง๊ธฐ(IDE)์ ์๋ ์์ฑ ๊ธฐ๋ฅ ๋๋ ค์ง
ํ์
์ถฉ๋ -> ํ์
์ด ๊ฒน์ณ์ ์ถฉ๋์ด ๋ฐ์
๐ฎ ํด๊ฒฐ
๊ธ๋ก๋ฒ ํจํค์ง๊ฐ ํ์ํ์ง ์์ ์ํฉ์ด๋ผ๋ฉด, type ์ต์
์ ๋น์ ๋ ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
// src/tsconfig.json
{
"compilerOptions": {
// ...
// Don't automatically include anything.
// Only include `@types` packages that we need to import.
"types": []
},
"files": ["foo.ts"]
}
๋ง์ฝ ๋ช๊ฐ์ง ํจํค์ง๊ฐ ๊ธ๋ก๋ฒ๋ก ํ์ํ๋ค๋ฉด, ์๋์ ๊ฐ์ด ์ถ๊ฐํ ์ ์๋ค.
// tests/tsconfig.json
{
"compilerOptions": {
// ...
// Only include `@types/node` and `@types/mocha`.
"types": ["node", "mocha"]
},
"files": ["foo.test.ts"]
}
TypeScript๋ ๊ธฐ๋ณธ์ ์ผ๋ก node_modules์ ์๋ @types ํจํค์ง๋ฅผ ์๋์ผ๋ก ํฌํจ์์ผ, ๊ฐ๋ฐ์๊ฐ importํ์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ๋ ํ๋ก์ ํธ์ ๋ก๋๋๋ค. ๊ทธ๋์ type์ ๋น์๋๊ฑฐ๋ ํ์ํ ๋ถ๋ถ๋ง ๋ฃ๋๋ค.
--incremental ์ต์ ์ ์ฌ์ฉํ๋ฉด, TypeScript๋ ์ด์ ์ปดํ์ผ ์ ๋ณด๋ฅผ .tsbuildinfo ํ์ผ์ ์ ์ฅํ๋ค. ์ด ํ์ผ์ ์ด์ ์ปดํ์ผ ์ดํ์ ๋ณ๊ฒฝ๋ ํ์ผ๋ง ๋ค์ ์ฒดํฌํ๊ณ ์ปดํ์ผํด์ ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๋งค๋ฒ ์๋ก ์ปดํ์ผํ ํ์๊ฐ ์๋๋ก ํด์ค๋ค. ์ฆ, ์ต์ํ์ ๋ณ๊ฒฝ๋ ํ์ผ๋ง ์ปดํ์ผํ๋ค. TypeScript๊ฐ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ ์๋๊ฐ ๋นจ๋ผ์ง๋ ์ฅ์ ์ด ์๋ค.
--incremental ์ต์ ์ ๋ณ๊ฒฝ๋ ํ์ผ๋ง ์ปดํ์ผํด์ ์ปดํ์ผ ์๋๋ฅผ ๊ฐ์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
composite ์ค์ ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋ก์ ํธ์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ปดํ์ผ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ด์.
๊ธฐ๋ณธ๊ฐ์ผ๋ก, ํ์ ์คํฌ๋ฆฝํธ๋ ํ๋ก์ ํธ ๋ด์ ์๋ .d.ts ํ์ผ์ ๋ชจ๋ ์ฒดํฌํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ด์๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฌ๋, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ ์์ ์ด๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, .d.ts๋ ์ ์๋ํ๋ ํ์ผ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ .d.ts์ ์ฒดํฌ๋ฅผ ๋๋ skipDefaultLibCheck ์ต์ ์ ์ ๊ณตํ๋ค. (์ด๋ deprecated๋์๋ค. ๊ทธ๋ฅ skipLibCheck์ ์ฐ๋ฉด ๋๋ค.)
interface Animal {}
interface Dog extends Animal {}
interface JayG extends Dog {}
์ฐ๋ฆฌ๊ฐ ๋๋ฌผ(Animal), ๊ฐ์์ง(Dog), ๊ทธ๋ฆฌ๊ณ JayG(๊ฐ์์ง์ ํ ์ข ๋ฅ)๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค. ๊ฐ ํ์ (Animal, Dog, JayG)์ด ์๊ณ , ์ด๋ค์ด ํ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์์๊น?
Covariance๋ ๊ฐ์์ง๊ฐ ๋๋ฌผ์ ํ ์ข ๋ฅ๋๊น ๊ฐ์์ง๋ฅผ ๋๋ฌผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฐ๋ ์ด๋ค. ์ฆ, ํ์ ํ์ ์ธ ๊ฐ์์ง๋ฅผ ์์ ํ์ ์ธ ๋๋ฌผ๋ก ์ทจ๊ธํ ์ ์๋ค.
function hello(d: Dog) {}
let dog: Dog = { name: 'hi', kind: 'mix' }
let jayg: JayG = { name: 'hi', kind: 'mix', age: 34 }
hello(dog) // ok
hello(jayg) // ok
๊ฐ์์ง๋ฅผ ๊ธฐ๋ํ๋ ํจ์ hello์ ๊ฐ์์ง(Dog)๋ฟ๋ง ์๋๋ผ, ๊ฐ์์ง์ ํ ์ข ๋ฅ์ธ JayG๋ ๋ฃ์ ์ ์๋ค.
์์ ํ์ ์ธ ๋๋ฌผ์ ํ์ ํ์ ์ธ ๊ฐ์์ง๋ก ์ฒ๋ฆฌํ๋ค. ๋ง์ด ์ด๋ ต์ง๋ง, ์์ ํ์ ์ ํ์ ํ์ ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
function helloDog(d: Dog) {
console.log("๊ฐ์์ง์ ์ธ์ฌํด์!");
}
function helloAnimal(a: Animal) {
console.log("๋๋ฌผ๊ณผ ์ธ์ฌํด์!");
}
helloDog = helloAnimal; // OK! ๋๋ฌผ๊ณผ ์ธ์ฌํ๋ ํจ์๋ ๊ฐ์์ง์๋ ์ธ์ฌํ ์ ์์ด
helloAnimal = helloDog; // Error! ๊ฐ์์ง์ ์ธ์ฌํ๋ ํจ์๊ฐ ๋ชจ๋ ๋๋ฌผ๊ณผ ์ธ์ฌํ ์๋ ์์ด์
๋ฅธ ํ์ ์ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ. ๊ฐ์์ง๋ฉด ๊ฐ์์ง๋ง, ๋๋ฌผ์ด๋ฉด ๋๋ฌผ๋ง. ์ด๊ฑด ์๋ก ๋ค๋ฅธ ํ์ ์ ์์ด์ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
์๋ฌด ํ์ ์ด๋ ๋ค ํ์ฉํ๋ค.
๐ค ๊ทธ๋์ ?
์ต์ ์ ์ผ๋ฉด ํจ์์ ์ธ์๋ฅผ ๋ ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํด์, ์ค์๋ฅผ ์ค์ด๊ณ ์ปดํ์ผ์ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค! (๋งค์ ํ์ ์ ๋งค๊ฐ๋ณ์์ ๋ํด Contravariance์ ๊ฐ์ ํ๋ค.)
๋๋ถ๋ถ์ ์๊ฐ์, ์จ๋ ํํฐ ํด์ธ Gulp, Rollup, Webpack ๋ฑ๊ณผ ํจ๊ป ์คํํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋๋ ค๋ณด์ผ ์ ์๋ค. tsc --extendedDiagnostics ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์คํฌ๋ฆฝํธ์ ํด๊ฐ์ ์ฃผ์ ๋ถ์ผ์น๋ฅผ ์ฐพ์ ๋ธ๋ค๋ฉด, ์๋ชป๋ ์ค์ ๋๋ ๋นํจ์จ์ ์ธ ๋ถ๋ถ์ ์ง์ด๋ผ ์ ์๋ค.
์ด๋ฅผ ํตํด ์ผ๋ํด์ผ ํ ์ ์
tsc ๋จ๋
์คํ๊ณผ ํ์
์คํฌ๋ฆฝํธ์ ์ฐ๋ํ ๋ค์ํ ๋น๋ ํด ์ฌ์ด์ ๋น๋ ์๊ฐ ์ฐจ์ด๊ฐ ํ๊ฒฉํ๊ฒ ๋๋์ง
๋น๋ ํด์ด ์ง๋จ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ, ํ์
์คํฌ๋ฆฝํธ์ ๊ฒฐ๊ณผ์ ์ฐจ์ด๊ฐ ์๋์ง
๋น๋ ํด์ ์์ธ์ด ๋ ์ ์๋ ์์ฒด ์ต์
์ด ์๋์ง
๋น๋ ํด์ ์์ธ์ด ๋ ์ ์๋ ํ์
์คํฌ๋ฆฝํธ ๊ตฌ์ฑ์ด ์๋์ง (ts-loader ์ ๊ฐ์ด)์ด๋ค.
๊ณต์ ๋ ํฌ ์ฐธ๊ณ
https://github.com/microsoft/TypeScript/wiki/Performance